一、二进制
- 二进制的最高位是符号位:0表示正数,1表示负数
- 正数 的源码反码,补码,都一样
- 负数的反码=它的源码 符号 位不变,其它位取反(0->1,1->0)
- 负数的补码=它的反码+1
- 0的反码补码都是0
- php没有无符号数
- 在计算机 运算 的时候,都是以补码的方式来运算的
例:
-1 的源码 10000000 00000000 00000000 00000001
-1 的反码 11111111 11111111 11111111 11111110
-1 的补码 11111111 11111111 11111111 11111111
二、位运算
- 按位与& :两位全为1,结果为1
- 按位或| :两位有一个为1,结果为1
- 按位异或^:两位一个为0,1个为1,结果为1
- 按位取反~:0->1,1->0
- 右移>>:向右移动n次(除以2的n次方),低位溢出,并用符号位补溢出的高位,符号位不变
- 左移<<:向左移动n次(乘以2的n次方),低位补0,符号位不变
例&:
2&3=?
2的补码 00000000 00000000 00000000 00000010
3的补码 00000000 00000000 00000000 00000011
2&3的补码 00000000 00000000 00000000 00000010(补码)
例|:
2的补码 00000000 00000000 00000000 00000010
3的补码 00000000 00000000 00000000 00000011
2|3 00000000 00000000 00000000 00000011
例^:
2的补码 00000000 00000000 00000000 00000010
3的补码 00000000 00000000 00000000 00000011
2^3 00000000 00000000 00000000 00000001
例~:
~2=?
步骤:
1.首先求出2的补码,2是整数,所以 原码=反码=补码
00000000 00000000 00000000 00000010
2.取反后,为 ?的补码
11111111 11111111 11111111 11111101
3.?的补码-1,为 ?的反码
11111111 11111111 11111111 11111100
4.?的反码取反,为 ?的值
10000000 00000000 00000000 00000011 => -3
例>>:
1>>2=?
1的补码 00000000 00000000 00000000 00000001
右移2位 00(<补位)00000000 00000000 00000000 000000(截断)01
例>>:
-1>>2=?
-1的原码 10000000 00000000 00000000 00000001
-1的反码 11111111 11111111 11111111 11111110
-1的补码 11111111 11111111 11111111 11111111
右移2位 11111111 11111111 11111111 11111111(补码)
补码-1 11111111 11111111 11111111 11111110(反码)
取反码 10000000 00000000 00000000 00000001
例<<:
1<<2=?
1的补码 00000000 00000000 00000000 00000001
左移2位 00(截断)000000 00000000 00000000 00000001(补位>)00
例<<:
-1<<2=?
-1的原码 10000000 00000000 00000000 00000001
-1的反码 11111111 11111111 11111111 11111110
-1的补码 11111111 11111111 11111111 11111111
左移2位 11111111 11111111 11111111 11111100(补码)
补码-1 11111111 11111111 11111111 11111011(反码)
取反码 10000000 00000000 00000000 00000100
echo 6&3;//2 echo "<br>"; echo 6|3;//7 echo "<br>"; echo 6^3;//5 echo "<br>"; echo ~6;//-7 echo "<br>"; echo 6>>3;//0 echo "<br>"; echo 6<<3;//48 echo "<br>"; echo -6&3;//2 echo "<br>"; echo -6|3;//-5 echo "<br>"; echo -6^3;//-7 echo "<br>"; echo ~-6;//5 echo "<br>"; echo -6>>3;//-1 echo "<br>"; echo -6<<3;//48