比如十进制的32 = 2*10的0次方 加上 3*10的一次方
以此类推
二进制:逢二进一
二进制(0,1)
二进制的最高位为符号位 0表负数 1为负数
正数的原码 反码 补码 都是一样的
负数的反码=它的原码符号位不变,其他位取反 0变1 1变零
负数的补码=反码加1
0的反码 补码都是0
PHP没有无符号数
计算机运算的时候都是以补码的方式运算的
举例:
-1的原码为
10000000 00000000 00000000 00000001
反码为
11111111 11111111 11111111 11111110
补码为
11111111 11111111 11111111 11111111
一个二进制字符 占用四个字节 一个字节等于8个bit
那么1的二进制表示为
00000000 00000000 00000000 00000001
PHP 位运算符号
& 按位与 两位全为1 结果为1
| 按位或 两位有一个为1 结果就为1
^ 按位异或 一个为0 一个为1 结果为1
~ 俺位取反 0->1 1->0
d emo
~2 = ?
步骤:
先找出2的补码(正数的反码 原码 补码都是同一个)
00000000 00000000 00000000 00000010
再按位取反
11111111 11111111 11111111 111111101(补码-> 原码)
11111111 11111111 11111111 111111100 反码
10000000 00000000 00000000 000000011 原码
1+1*2的零次方 + 1* 2的一次方 = -3
2&3 =?
2的补码
00000000 00000000 00000000 000000010
3的补码
00000000 00000000 00000000 000000011
所以得
到补码为
00000000 00000000 00000000 000000010
正数的补码 反码 都是一样
所以
答案是2
其他的类推
PHP 移位运算符
<< 算数坐移
>>
对二进制数进行移动
运算规则:
算术右移:低位溢出,符号位不变,并且符号位补溢出的高位
算术左移:符号位不变,低位补零
demo:
$a = 1>>2
1的补码
00000000 00000000 00000000 00000001
01 溢出 在高位补符号位 00(符号位不变)
答案是0
$a = -1<<2
10000000 00000000 00000000 00000001 原码
11111111 11111111 11111111 11111110 反码
11111111 11111111 11111111 11111111 补码
11111111 11111111 11111111 11111100
11111111 11111111 11111111 11111011
10000000 00000000 00000000 00000100
-4