位运算符是变量值转换成二进制进行比较
1. & 按位与(And) $a & $b
//二者都为 1 时为 1 ,否则为 0。即把 $a 和 $b 中都为 1 的位设为 1 ,否则设为 0
$a = 2; //00000010
$b = 1; //00000001
$c = 3; //00000011
var_dump($a & $b); //false
var_dump($b & $c); //true
2. ^ 按位异或(Xor) $a ^ $b
//在按位异或的过程中,不同为1,相同为0 。
$a = 2; //00000010
$b = 1; //00000001
$c = 3; //00000011
var_dump($a ^ $b); //00000011 3
var_dump($b ^ $c); //00000010 2
3. | 按位或(Or) $a | $b
//在按位或的过程中,有1为1,全0为0
$a = 2; //00000010
$b = 1; //00000001
$c = 4; //00000100
var_dump($a | $b); //00000011 3
var_dump($b | $c); //00000101 5
4. ~ 按位取反(Not) ~ $a
//在计算机中,负数以其正值的补码形式表达
$a = 2; //00000010
var_dump(~ $a); // -3
//2的32位二进制原码为 0000 0000 0000 0000 0000 0000 0000 0010
//观察取反后的结果:从左向右看,第一位 0: + ,1: -
//按位取反后为 -1111 1111 1111 1111 1111 1111 1111 1101
//负数是用补码表示的,补码是原码取反+1,也就是说
//-1111 1111 1111 1111 1111 1111 1111 1101 是2取反+1得到的,所以需要-1,得到的结果是
//-1111 1111 1111 1111 1111 1111 1111 1100 然后再取反是
//0000 0000 0000 0000 0000 0000 0000 0011 得到的结果是3
//别忘了前面的负号,最终结果-3
5. << 左移 Shift Left $a << $b
//将 $a 中的位向左移动 $b 次
$a = 1; //00000001
$b = 2; //00000010
//$a 左移2个位置
var_dump($a << $b); //00001000 8
6. >> 右移 Shift Right $a >> $b
//将 $a 中的位向右移动 $b 次
$a = 5; //00000101
$b = 2; //00000010
//$a 右移2个位置
var_dump($a << $b); //00000001 1