一、二进制原码、反码、补码
1:二进制的最高位是符号位:0表示正数,1表示负数。
2:正数的原码、反码、补码都一样。
3:负数的反码=它的原码符号位不变,其他位取反(0变1,1变0)。
4:负数的补码=它的反码+1。
5:0的反码,补码都是0。
6:php没有无符号数,php中的数都是有符号的。
7:在计算机运算的时候,都是以补码的方式来运算的。
二、位运算
1:按位与& :两位全为1,结果为1
2:按位或| :两位有一个为1,结果为1
3:按位异或^:两位一个为0,一个为1,结果为1
4:按位取反~:0变1,1变0
5:算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
6:算术左移<<:符号位不变,低位补0
例:~2=-3 2&3=2 2|3=3 2^3=1;
题目:
13&7=?
13补码:00000000 00000000 00000000 00001101
7补码:00000000 00000000 00000000 00000111
13&7:00000000 00000000 00000000 00000101 =5 两位全为1,结果为1
5|4=?
5补码:00000000 00000000 00000000 00000101
4补码:00000000 00000000 00000000 00000100
5|4:00000000 00000000 00000000 00000101 =5 两位有一个为1,结果为1
-3^3=?
-3原码:10000000 00000000 00000000 00000011
-3反码:11111111 11111111 11111111 11111100
-3补码:11111111 11111111 11111111 11111101
3补码:00000000 00000000 00000000 00000011
-3^3:11111111 11111111 11111111 11111110 =-2 两位一个为0,一个为1,结果为1
$a=1>>2;
1的补码:00000000 00000000 00000000 00000001
1>>2:00000000 00000000 00000000 00000000 =0 低位溢出,符号位不变,并用符号位补溢出的高位
$a=-1>>2;
-1的原码:10000000 00000000 00000000 00000001
-1的反码:11111111 11111111 11111111 11111110
-1的补码:11111111 11111111 11111111 11111111
-1>>2:11111111 11111111 11111111 11111111 (补码)低位溢出,符号位不变,并用符号位补溢出的高位
结果:
补码->原码
反码:11111111 11111111 11111111 11111110
原码:10000000 00000000 00000000 00000001 =-1
1<<2
1的补码:00000000 00000000 00000000 00000001
1<<2: 00000000 00000000 00000000 00000100 =4 符号位不变,低位补0