运算符 | 名称 | 结果 |
---|---|---|
& | And(按位与) | 将把 $a 和 $b 中都为 1 的位设为 1 |
| | Or(按位或) | 将把 $a 和 $b 中任何一个为 1 的位设为 1 |
^ | Xor(按位异或) | 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1 |
~ | Not(按位取反) | 将 $a 中为 0 的位设为 1,反之亦然 |
<< | AShift left(左移) | 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”) |
>> | Shift right(右移) | 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”) |
$a = 3; // 011
$b = 5; // 101
$a & $b = 1; // 011 & 101 = 001
$a = 3; // 011
$b = 5; // 101
$a | $b = 7; // 011 | 101 = 111
$a = 3; // 011
$b = 5; // 101
$a ^ $b = 6; // 011 | 101 = 110
//1.二进制的最高位是符号位,0表示正数,1表示负数。
//2.正数的原码,反码,补码都一样。
//3.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)。
//4.负数的补码=它的反码+1。
//5.0的反码,补码都是0.
//6.在计算机运算的时候,都是以补码的方式来运算的,那么运算完后得到的结果也是某个数的补码
$a = 5; // 101
// 源码:0000 0101 // $a 源码
// 补码:1111 1010 // 第一位是符号位,1代表负号,表示这是一个负数;记住运算和运算结果都是用补码表示的,所以这个时候我们得到的是补码,我们还需要推导反码和原码
// 反码:1111 1001 // 反码=补码-1
// 原码:1000 0110 // 符号位不动,其他取反 ~$a 源码
~ $a = -6;
$a = 3; // 011
$b = 5; // 101
$b << $a = 40; // 5*2*2*2 = 101000
$a = 3; // 011
$b = 16; // 10000
$b >> $a = 2; // 16/2/2/2 = 2