位运算符的简介
位运算符用来对二进制位进行操作,Java中提供了如下表所示的位运算符:位运算符中,除 ~ 以外,其余均为二元运算符。
操作数只能为整型和字符型数据。
3.4.1补码
Java使用补码来表示二进制数,在补码表示中,最高位为符号位,正数的符号位为0,负数为1。补码的规定如下:
对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。
对负数而言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。如-42的补码为11010110(00101010按位取反11010101+1=11010110)
用补码来表示数,0的补码是唯一的,都为00000000。(而在原码,反码表示中,+0和-0的表示是不唯一的,可参见相应的书籍)。而且可以用111111表示-1的补码(这也是补码与原码和反码的区别)。
3.4.2按位取反运算符~
~ 是一元运算法,对数据的每个二进制位取反,即把1变为0,把0变为1。
例如:
0010101
~
1101010
注意,~运算符与-运算符不同,~21≠-21。
3.4.3按位与运算符&
参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0。即:
0&0=0,0&1=0,1&0=0,1&1=1
请问位运算符怎么理解
$a & $b and(按位与)
$a | $b or(按位或)
$a ^ $b Xor(按位异或)
~$a Not(按位非)
$a 《《 $b Shift left(左移)
$a 》》 $b Shift right(右移)
详解
$a & $b 按位与 把$a和$b中都为1的位设为1;
例:10 & 12 = 8
10 1010
12 1100
1000 8
$a | $b 按位或 把$a或$b中有一个为1的为设为1;
例:10 | 12 = 14
10 1010
12 1100
1110 14
$a ^ $b 按位异或
例:10 ^ 12
10 1010
12 1100
0110 6
~a 按位非 把$a中的为0的为设为1,1的为设为0
例:~10 =
10 1010 1111111111111111111111111111111111111111111111111111111111110101 -11
$a 《《 $b 左移 把$a中的为向左移动$b次(每一次移动都表示乘以2);
例:1 《《 10 = 1024
1(1) 左移10位 10000000000(1024)
相当于1*2的10次方,php中没有幂运算真是郁闷。
$a 》》 $b 右移 把$a中的为向右移动$b次(每一次移动都表示除以2);
例:1024 《《 2 = 1256
10000000000(1024) 右移2位就是 100000000(256)
php为运算$a & $b and(按位与)$a | $b or(按位或)$a ^ $b Xor(按位异或)~$a Not(按位非)$a 《《 $b Shift left(左移)$a 》》 $b Shift right(右移)
详解$a & $b 按位与 把$a和$b中都为1的位设为1;例:10 & 12 = 810 101012 1100 1000 8
$a | $b 按位或 把$a或$b中有一个为1的为设为1;例:10 | 12 = 1410 101012 1100 1110 14
$a ^ $b 按位异或例:10 ^ 1210 101012 1100 0110 6
~a 按位非 把$a中的为0的为设为1,1的为设为0例:~10 = 10 1010 1111111111111111111111111111111111111111111111111111111111110101 -11
$a 《《 $b 左移 把$a中的为向左移动$b次(每一次移动都表示乘以2);例:1 《《 10 = 10241(1) 左移10位 10000000000(1024)相当于1*2的10次方,php中没有幂运算真是郁闷。
$a 》》 $b 右移 把$a中的为向右移动$b次(每一次移动都表示除以2);例:1024 《《 2 = 125610000000000(1024) 右移2位就是 100000000(256)
标志位字段与位运算符的结合
PHP里的error_reporting的参数值列表
value constant
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
4096 E_RECOVERABLE_ERROR
发现value的值都是跳跃式的吧,而且全是2的n+1次方.
再看下面这个。把value的值转成二进制了。
value constant
0000 0001 E_ERROR
0000 0010 E_WARNING
0000 0100 E_PARSE
0000 1000 E_NOTICE
0001 0000 E_CORE_ERROR
0010 0000 E_CORE_WARNING
.
.
.
… …一次为每加一次方就是二进制加了一位(学过计算机的差不多都知道:)…)
注意:每个选项对应了一位(1为开启 0为关闭)
好了,下面我们看看这么设置参数的好处。
举三个参数为例来看是什么效果吧
error_reporting(3);//decbin(3) == 0000 0011; (相当于设置 E_WARNING 和 E_ERROR )
error_reporting(4);//decbin(4) == 0000 0100;(相当于设置 E_PARSE )
error_reporting(5);//decbin(5) == 0000 0101;(相当于设置 E_PARSE 和 E_ERROR)
获取设置:
要看某项是否开启的判断可以用位运算来获得(& — “与”规则 全1为1,否则为0)
//E_PARSE
if($n & 4){
//E_PARSE开启
//4的二进制是 0100,因为只有第3位是1,所以进行”&”操作时其它何位置全被置0了
//因此只有$n的第三位也是1时结果才会大于0。
//如4(0100),5(0101),6(0110),7(0111)
}else{
//E_PARSE关闭
//第三位为0了就代表此选项是关闭状态
}
改变设置:($n代表当前的十进制值)
在应用时我们可能跟据需要针对某位进行开关设置。
看下面的用法。
//关闭E_PARSE项 用 ‘&’“与”规则
$n = $n&(8192-4-1);
//为什么用8191呢?
//这和你的选项数有关系,这个错误显示标记一共用了13位(4096的二进制是13位),而8192是(14位).
//为什么减4减1呢?
//8192-4-1=8187。(1111111111011)二进制是13位了,与我们用到的最大位数一样了。而且对应的第三位上的值是0了。
//用这个数去和1到4096之间任何一个数按位“与”运算,是不是除了第三位会置0,其它位上的值不会变化呢? ”与”规则 :)
//同理,想关掉 E_WARNING
//$n = $n&(8192-2-1);
//开启E_PARSE项用到‘|’“或”规则
$n = $n|
$ a&$ b和(根据位置和)$ a | $ b或(根据位置OR)$ a ^ $ b xor(根据位置或)〜$ a不左(左sh)$ a“》 $ b SHIFT右11001000 8 $ a | $ b plus或设置一个$ a或$ b as 1 as 1;例如:10 | 12 = 1410 101012 11001110 14 $ a ^ $ b按下或示例:10 ^ 1210 101012 11000110 6〜A设置为1,1,设置为1, 1设置为0案例:〜10 = 1010 111111111111111111111111111111111111111111111111111111 $每移$ b的左侧(每个运动意味着乘以2);例如:“ 10 = 10241(1)10th -move 1000000000(1024)到10个步骤为1*2,在PHP中,在PHP中,它确实是沮丧的,没有运气。 $ a“》 $ b右移动向右移动的权利移动(每个动作都除以2);例如:1024“ 2 = 1256100000000000000000000000000000000000000000000000000000000移动机(1024)右MOVES 2位置10000000000000000000000000000000000000000000000000000000000000000000000来万人组组组组组杆针1000000.8.8.8点期(256(256))PHP是PHP $ a&$ b的操作(根据位置和)$ a | $ b或(根据位置OR)$ a ^ $ b xor(根据位置或)〜$ a not(non-)$ a“” $ b SHIFT左(左shit)$ a“” $ b Shift右12 = 810 101012 1100 1000 8 $ a | $ b按下或设置$ a或$ b as 1 as 1 as 1;例如:10 | 12 = 1410 101012 1110 1110 14 $ a ^ $ b不同或示例:10 ^ 1210 101012 1100 0110 6〜A设置为0 as 1,1,设置为1,1,设置为0情况:〜10 = 101011111111111111111111111111111111111111111111111111111111111111111111111回旋(每个运动都乘以2);例如:1“ 10 = 10241(1)第10个运动1000000000(1024)等于第10侧的1*2,PHP中没有能力运气。它真的很沮丧。 $ a“》 $ b右移动向右移动的右移动(每个移动都除以2);例如:1024“ 2 = 1256100000000000000000000000000000000000000000000000000000000移动机(1024)右MOVES 2位置1000000000000000000000000000000000000000000000000000000000000000000来果(256(256))。与位运算符的结合PHP里的error_reporting的参数值列表value constant1 E_ERROR2 E_WARNING4 E_PARSE8 E_NOTICE16 E_CORE_ERROR32 E_CORE_WARNING64 E_COMPILE_ERROR128 E_COMPILE_WARNING256 E_USER_ERROR512 E_USER_WARNING1024 E_USER_NOTICE2047 E_ALL2048 E_STRICT4096 E_RECOVERABLE_ERROR发现value的值都是跳跃式的吧,而且全是2的n+one side 。关闭)。让我们看一下以这种方式设置参数的好处。以三个参数为例。error_reporting(3); // decbin(3)== 0000 0011;(等于设置e_warning和e_error)error_reporting(Reforting( 4); // decbin(4)== 0000 0100;(equiv设置e_parse)error_reporting(5); // decbin(5)== 0000 0101; (等效于设置E_PARSE和E_ERROR)获取设置:取决于是否可以打开判决以获取它(& - ”和“规则全部1为1,否则为0)// e_parseif($ n&4){// e_parse打开// 4 0100的二进制为0100,因为只有第三名是1,所以“&”其他位置都放置为0 //因此,仅$ n的第三名也超过0时,当时是1 。 n表示当前的小数值)我们可能会设置开关设置,并在应用时需要特定设置。查看下面的用法。 //使用“&”和“规则” $ n = $ n&(8192-4-1)关闭E_PARSE项目; //为什么要使用8191? //这与您的选择有关。此错误显示标签总计13位数字(4096二进制是13位数字),而8192是(14 -bit).//为什么减去4? // 8192-4-1 =8187。(1111111111111)二进制为13位,与我们使用的最大数字相同。相应的第三值是0。//使用此数字,1到4096至“,”,“和”和“以及位置的操作。另一个位上的值除外,其他位是否不会更改? “规则:) //类似地,要关闭e_warning // $ n = $ n&(8192-2-1); //打开E_PARSE项目以使用'或“规则$ n = $ n | 4; //看到上面的封闭后,我有一个打开的想法:) //'|' - ”或“规则1 IS 1 IS 0 //现在位置在0 :) //时不会影响其他位置在操作1中,所有其他职位0都可以。 //您找到了吗?碰巧的是,小数值与我们的每个设置相对应:)这是这个想法。如果要同时在多个位上操作设置值,则取决于设置操作的方式。将来,当您遇到一个参数以同时设置多个选项时,我们可以考虑使用此方法:)-位运算符
|$ a&$ b和(根据位置和)$ a | $ b或(根据位置OR)$ a ^ $ b xor(根据位置或)〜$ a不左(左sh)$ a“》 $ b SHIFT右11001000 8 $ a | $ b plus或设置一个$ a或$ b as 1 as 1;例如:10 | 12 = 1410 101012 11001110 14 $ a ^ $ b按下或示例:10 ^ 1210 101012 11000110 6〜A设置为1,1,设置为1, 1设置为0案例:〜10 = 1010 111111111111111111111111111111111111111111111111111111 $每移$ b的左侧(每个运动意味着乘以2);例如:“ 10 = 10241(1)10th -move 1000000000(1024)到10个步骤为1*2,在PHP中,在PHP中,它确实是沮丧的,没有运气。 $ a“》 $ b右移动向右移动的权利移动(每个动作都除以2);例如:1024“ 2 = 1256100000000000000000000000000000000000000000000000000000000移动机(1024)右MOVES 2位置10000000000000000000000000000000000000000000000000000000000000000000000来万人组组组组组杆针1000000.8.8.8点期(256(256))PHP是PHP $ a&$ b的操作(根据位置和)$ a | $ b或(根据位置OR)$ a ^ $ b xor(根据位置或)〜$ a not(non-)$ a“” $ b SHIFT左(左shit)$ a“” $ b Shift右12 = 810 101012 1100 1000 8 $ a | $ b按下或设置$ a或$ b as 1 as 1 as 1;例如:10 | 12 = 1410 101012 1110 1110 14 $ a ^ $ b不同或示例:10 ^ 1210 101012 1100 0110 6〜A设置为0 as 1,1,设置为1,1,设置为0情况:〜10 = 101011111111111111111111111111111111111111111111111111111111111111111111111回旋(每个运动都乘以2);例如:1“ 10 = 10241(1)第10个运动1000000000(1024)等于第10侧的1*2,PHP中没有能力运气。它真的很沮丧。 $ a“》 $ b右移动向右移动的右移动(每个移动都除以2);例如:1024“ 2 = 1256100000000000000000000000000000000000000000000000000000000移动机(1024)右MOVES 2位置1000000000000000000000000000000000000000000000000000000000000000000来果(256(256))。与位运算符的结合PHP里的error_reporting的参数值列表value constant1 E_ERROR2 E_WARNING4 E_PARSE8 E_NOTICE16 E_CORE_ERROR32 E_CORE_WARNING64 E_COMPILE_ERROR128 E_COMPILE_WARNING256 E_USER_ERROR512 E_USER_WARNING1024 E_USER_NOTICE2047 E_ALL2048 E_STRICT4096 E_RECOVERABLE_ERROR发现value的值都是跳跃式的吧,而且全是2的n+one side 。关闭)。让我们看一下以这种方式设置参数的好处。以三个参数为例。error_reporting(3); // decbin(3)== 0000 0011;(等于设置e_warning和e_error)error_reporting(Reforting( 4); // decbin(4)== 0000 0100;(equiv设置e_parse)error_reporting(5); // decbin(5)== 0000 0101; (等效于设置E_PARSE和E_ERROR)获取设置:取决于是否可以打开判决以获取它(& - ”和“规则全部1为1,否则为0)// e_parseif($ n&4){// e_parse打开// 4 0100的二进制为0100,因为只有第三名是1,所以“&”其他位置都放置为0 //因此,仅$ n的第三名也超过0时,当时是1 。 n表示当前的小数值)我们可能会设置开关设置,并在应用时需要特定设置。查看下面的用法。 //使用“&”和“规则” $ n = $ n&(8192-4-1)关闭E_PARSE项目; //为什么要使用8191? //这与您的选择有关。此错误显示标签总计13位数字(4096二进制是13位数字),而8192是(14 -bit).//为什么减去4? // 8192-4-1 =8187。(1111111111111)二进制为13位,与我们使用的最大数字相同。相应的第三值是0。//使用此数字,1到4096至“,”,“和”和“以及位置的操作。另一个位上的值除外,其他位是否不会更改? “规则:) //类似地,要关闭e_warning // $ n = $ n&(8192-2-1); //打开E_PARSE项目以使用'或“规则$ n = $ n | 4; //看到上面的封闭后,我有一个打开的想法:) //'|' - ”或“规则1 IS 1 IS 0 //现在位置在0 :) //时不会影响其他位置在操作1中,所有其他职位0都可以。 //您找到了吗?碰巧的是,小数值与我们的每个设置相对应:)这是这个想法。如果要同时在多个位上操作设置值,则取决于设置操作的方式。将来,当您遇到一个参数以同时设置多个选项时,我们可以考虑使用此方法:)-位运算符
C语言位运算符
b“ 1是将b乘以2,您会考虑到它,而小数为1243,左移动为12430,相当于1243乘以10 12430二进制二进制。1011左ONE IS 10110是10110,等于等效于等效。对于等效的“ 10”,但是二进制“ 10”是2,所以它乘以2-位运算符