1、二进制的基本概念。
1、二进制的最高位是符号位:0 表示正数,1表示负数
2、正数的原码、反码、补码都一样
3、原码既是它的二进制数据
4、负数的反码等于它的原码符号不变,其他位取反(0变1,1变0)
5、负数的补码等于它的反码加1
6、0的反码、补码都是0
7、在计算机运算的时候,都是以补码的方式来运算的。
2、位运算的基本概念
1、$a & $b 按位与 ,将把$a 和$b中 都为1的位设为1
2、$a | $b 按位或 ,将把$a 或者$b中为1的位设为1
3、$a ^ $b 按位异或 ,将把$a 和$b中不同的位设为1,既两个位都不相同即为1.
4、~$a 按位取反 ,将把$a 为0的位设为1,为1的位设为0
5、$a<<$b 左移,将$a中的位向左移动$b次 (每一次移动都表示乘以2)
6、$a>>$b 右移,将$a中的位向右移动$b次 (每一次移动都表示除以2)
算术左移 :符号位不变,低位补0
算术右移 :符号不变,低位溢出,并用符号位补溢出的高位
3 、实战
计算
2&3= ?
PHP中一个整数占4个字节32位。
1、2的原码为 00000000 00000000 00000000 00000010,正数的反码、补码和原码一样
2、3的原码 00000000 00000000 00000000 00000011,正数的反码、补码和原码一样
3、将2的补码和3的补码进行按位与运算,即将00000000 00000000 00000000 00000010和00000000 00000000 00000000 00000011都为1的位设为1
计算的结果补码为00000000 00000000 00000000 00000010
4、将按位与运算完后的补码转换成原码、将原码转为10进制数据,所以结果为2
~2 = ?
1、2的原码为 00000000 00000000 00000000 00000010,正数的反码、补码和原码一样
2、将补码取反,结果为 11111111 11111111 11111111 11111101
3、将补码转成反码,最高位1不动、表示符号负数,因为负数的补码是由反码加1得到,所以补码转成反码就是减1,反码为11111111 11111111 11111111 11111100
4、将反码转成原码,负数的反码是原码的取反,符号位不变,所以反码转原码亦一样,原码为 10000000 00000000 00000000 00000011
5、将原码转为10进制数据,结果为- 3
读者可以尝试计算下列数据
2 | 3 = 3
2的原码,反码、补码00000000 00000000 00000000 00000010
3的原码,反码、补码00000000 00000000 00000000 00000011
2 | 3的原码,反码、补码00000000 00000000 00000000 00000011
~ - 5 =4
-5
原码 10000000 00000000 00000000 00000101
反码 11111111 11111111 11111111 11111010
补码 11111111 11111111 11111111 11111011
~ - 5
补码 00000000 00000000 00000000 00000100
反码 00000000 00000000 00000000 00000100
原码 00000000 00000000 00000000 00000100
结果为4
-3 ^ 3 = -2
-3的原码 10000000 00000000 00000000 00000011 反码 11111111 11111111 11111111 11111100
补码 11111111 11111111 11111111 11111101
3的原码、反码、补码 00000000 00000000 00000000 00000011
-3 ^ 3 的补码 11111111 11111111 11111111 11111110
反码11111111 11111111 11111111 11111101
原码10000000 00000000 00000000 00000010
-1 << 2 = -4
-1 的原码 10000000 00000000 00000000 00000001
反码 11111111 11111111 11111111 11111110
补码 11111111 11111111 11111111 11111111
-1 << 2 向左移动2位,符号位不变,低位补0,结果为 11111111 11111111 11111111 11111100
反码 11111111 11111111 11111111 11111011
原码 10000000 00000000 00000000 00000100
结果为 -4
-1 >> 2 = -1
-1 的原码 10000000 00000000 00000000 00000001
反码 11111111 11111111 11111111 11111110
补码 11111111 11111111 11111111 11111111
-1 >>2 向右移动2位,符号位不变,高位溢出,溢出位由符号位补齐,结果为
11111111 11111111 11111111 11111111
反码 11111111 11111111 11111111 11111110
原码 10000000 00000000 00000000 00000001
结果为 -1