位运算
位运算
位运算符允许对整型数中指定的位进行置位。如果左右参数都是字符串,则位运算符将操作字符的 ASCII 值。
例子 | 名称 | 结果 |
---|---|---|
$a & $b | And(按位与) | 将把 $a 和 $b 中都为 1 的位设为 1。 |
$a | $b | Or(按位或) | 将把 $a 或者 $b 中为 1 的位设为 1。 |
$a ^ $b | Xor(按位异或) | 将把 $a 和 $b 中不同的位设为 1。 |
~ $a | Not(按位非) | 将 $a 中为 0 的位设为 1,反之亦然。 |
$a << $b | Shift left(左移) | 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 |
$a >> $b | Shift right(右移) | 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 |
例:
~2
解题思路:在计算机运算的时候,都是以补码的方式来运算的。要得到2的补码:2为正数,正数的原码、反码、补码都一样。
2的补码:00000000 00000000 00000000 00000010
对的补码进行~非运算(取反):11111111 11111111 11111111 11111101 [补码 得到的是一个负数的补码 ,要根据它找到原码]
负数的补码=它的反码+1. :11111111 11111111 11111111 11111100 [反码]
负数的反码=它的原码符号位不变,其它位取反 ,取反得原码:
10000000 00000000 00000000 00000011 [原码]
最后的计算结果为:-3
~-2
解题思路:在计算机运算的时候,都是以补码的方式来运算的。要得到-2的补码:
先得到-2的原码:100000000 00000000 00000000 00000010 [-2原码] 负数的反码=它的原码符号位不变,其它位取反
-2的反码:11111111 11111111 11111111 11111101 [-2的反码] 负数的补码=它的反码+1.
-2的补码:11111111 11111111 11111111 11111110 [加1后进位了]
对-2的补码进行~非运算: 00000000 00000000 00000000 00000001 [运算后得到的也是补码,最高位是0,为正数,正数的原码、反码、补码都一样。]
得到最到结果为;1
2|3
先得到 2和3的补码:正数的原码、反码、补码都一样。
2 补码:00000000 00000000 00000000 00000010
3的补码:00000000 00000000 00000000 00000011
进行或运算:00000000 00000000 00000000 00000011 [补码 最高位是0,为正数,正数的原码、反码、补码都一样。]
最后结果:3
2&3
先得到 2和3的补码:正数的原码、反码、补码都一样。
2 补码:00000000 00000000 00000000 00000010
3的补码:00000000 00000000 00000000 00000011
进行与运算(都为1才为1):
00000000 00000000 00000000 00000010[补码 最高位是0,为正数,正数的原码、反码、补码都一样。]
最后结果:2
2^3
先得到 2和3的补码:正数的原码、反码、补码都一样。
2 补码:00000000 00000000 00000000 00000010
3的补码:00000000 00000000 00000000 00000011
进行异或运算(不同的位设为 1。):
00000000 00000000 00000000 00000001 补码 最高位是0,为正数,正数的原码、反码、补码都一样。]
最后结果:1