位运算符
例子 | 名称 | 结果 |
$a & $b | And(与运算) | 将把 $a 和 $b 中都为1的位设为1 |
$a | $b | Or(或运算) | 将把 $a 和 $b 中任何一个为1的位设为1 |
$a ^ $b | Xor(异或运算) | 将把 $a 和 $b 中一个为1 另一个为0的位设为1 |
~ $a | Not(取反运算) | 将$a中为0的位设为1,反之亦然 |
$a << $b | Shift left(左移运算) | 将$a中的位向左移动$b次(每次移动都表示乘以2) |
$a >> $b | Shift right(右移运算) | 将$a中的位向右移动$b次(每次移动都表示除以2) |
1)与运算 var_dump(12 & -12)
000000000000000000000000000001100 [12的补码]
1111111111111111111111111111111110100 [-12的补码]
000000000000000000000000000000100 [补码](很显然是个正数)
1*2^2=4
2)或运算 var_dump(12 | -12)
000000000000000000000000000001100 [12的补码]
1111111111111111111111111111111110100 [-12的补码]
1111111111111111111111111111111111100 [补码] (这是一个负数)
减去1
000000000000000000000000000000001
11111111111111111111111111111111111011 [反码]
100000000000000000000000000000100 [原码]
-(1*2^2)= -4
3)异或运算 var_dump(12 ^ -12)
000000000000000000000000000001100 [12的补码]
1111111111111111111111111111111110100 [-12的补码]
1111111111111111111111111111111111000 [补码] (这是一个负数)
减去1
000000000000000000000000000000001
11111111111111111111111111111111110111 [反码]
100000000000000000000000000001000 [原码]
-(1*2^3)= -8
4)取反运算 var_dump(~12)
000000000000000000000000000001100 [12的补码]
1111111111111111111111111111111110011 [补码](这是个负数)
减去1
000000000000000000000000000000001
1111111111111111111111111111111110010 [反码]
100000000000000000000000000001101 [原码]
-(1*2^3+1*2^2+1*2^0)= -13
5)<<左移运算
000000000000000000000000000000001 [补码]
1往左移1位
000000000000000000000000000000010 [补码]
var_dump(1<<1);
6)>>右移运算
000000000000000000000000000000010 [补码]
000000000000000000000000000000001 [补码]
var_dump(2>>1);