位运算 7句话概括:
① 二进制最高位是符号位:0表示正数,1表示负数
② 正数原码,反码,补码都一样③ 负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
④ 负数的补码=它的反码+1
⑤ 0的反码,补码都是0
⑥ php没有无符号数,换言之,php中的数都是有符号数
⑦ 在计算机运算的时候,都是以补码的方式来运算的
二进制表示一个数,这个码就是 原码
1 的源码 ----> 00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000101
=> 1*2的零次方 + 0 * 2的一次方 + 1*2的二次方 + 0*2的零三方 + ...+ 0 +... = 1+0+4+0+..+0+.. = 5
-1 的源码 ----> 10000000 00000000 00000000 0000001
-1 的反码 ----> 11111111 11111111 11111111 11111110
-1 的补码 ----> 11111111 11111111 11111111 11111111
----------------------------------------------------------------------------------------------------------------------------------------------
php中有4个位运算符,分别是“按位与&、按位或|、按位异或^,按位取反~”
按位与&: 两位全为1,结果为1
按位或|: 两位有一个为1,结果为1
按位异或^:两位有一个为0,一个为1 ,结果为1
按位取反~:0->1,1->0
比如: ~2=-3 2&3=2 2|3=2 2^3=1
echo ~2; // -3
2 的源码:00000000 00000000 00000000 00000010 (正数的源码,反码,补码都一样)
2 取反: 11111111 11111111 11111111 11111101 (计算以补码方式运算,运算结果也是补码,需要转换成源码输出)
其反码: 11111111 11111111 11111111 11111100 (负数的补码=反码+1,故反码=补码-1)
其源码: 10000000 00000000 00000000 00000011 (负数反码=它的源码符号位不变,其他位取反。理解成:负数源码=他的反码符号位不变,其他位取反)
输出值:-3
echo ~-5; // 4
-5 的源码:10000000 00000000 00000000 00000101
-5 的反码:11111111 11111111 11111111 11111010
-5 的补码:11111111 11111111 11111111 11111011
~-5 取反: 00000000 00000000 00000000 00000100
输出值: 4
2&3 首先找到 2 和 3 的补码
2 的补码 00000000 00000000 00000000 00000010
3 的补码 00000000 00000000 00000000 00000011
2&3 00000000 00000000 00000000 00000010【补码】
输出值:2
2|3 首先找到 2 和 3 的补码
2 的补码 00000000 00000000 00000000 00000010
3 的补码 00000000 00000000 00000000 00000011
2|3 00000000 00000000 00000000 00000011【补码】
输出值:3
2^3 首先找到 2 和 3 的补码
2 的补码 00000000 00000000 00000000 00000010
3 的补码 00000000 00000000 00000000 00000011
2^3 00000000 00000000 00000000 00000001【补码】
输出值:1
-----------------------------------------------------------------------------------------------------------------------------------------------------
php 中 移位运算符
>>(右移) <<(左移) 算数右移和算数左移,运算规则
算数右移:低位溢出,符号位不变,并用符号位补溢出位的高位
算数左移:符号位不变,低位补0
1>>2
1 的补码 00000000 00000000 00000000 00000001
右移2位 ??000000 00000000 00000000 00000000 01
00000000 00000000 00000000 00000000
输出值:0
-1>>2
-1 的源码 10000000 00000000 00000000 00000001
-1 的反码 11111111 11111111 11111111 11111110
-1 的补码 11111111 11111111 11111111 11111111
右移2位 ??111111 11111111 11111111 11111111 11
11111111 11111111 11111111 11111111 【补码】
补码->反码->源码
其反码 11111111 11111111 11111111 11111110
其源码 10000000 00000000 00000000 00000001
输出值:-1
1<<2
1 的补码 00000000 00000000 00000000 00000001
左移2位 00 00000000 00000000 00000000 000001??
00000000 00000000 00000000 00000100
输出值:4
其他方式依此类推。