位运算
位运算是计算机将数据转换成二进制后做的计算。
计算机将数字转换成二进制时,如果是小数会先将小数转换为整数后再转为二进制格式,第一位代表符号位,正数是0,负数是1。如 -2.6 -> 1000 0000 0000 0000 0010。
对于特殊的数字如NaN、infinity进行位运算时都看作0.
二进制转换:每一位(n)代表2的(n-1)次方,然后相加,从末尾开始分别是2的0次方,1次方.....31次方。 如0011代表2的0次方(1)加2的一次方(2)是3
与运算 &
例:A & B,计算机操作步骤:
- 将 A 和 B 转为二进制数 a 和 b
- 将 a 和 b 做与运算,同位比较
- 如都为1,返回1
- 都为0,返回0
- 一个1一个0,返回0
如2 & 4
2的二进制:0010
4的二进制:0100
结果为0000=0
或运算 |
例:A | B,计算机操作步骤:
- 将 A 和 B 转为二进制数 a 和 b
- 将 a 和 b 做或运算,同位比较
- 都为0,返回0
- 都为1,返回1
- 一个0一个1,返回1
如3 | 5 3的二进制:0011 5的二进制:0101
结果为0111= 1 + 2 + 4 = 7
非运算 ~
例:~A,计算机操作步骤:
- 将A转换成二进制数a,拿出真码
- 对a各个位取反,0->1,1->0,得到补码
- 补码减1得到反码
- 符号位不变,其余位再次取反,得到真码
- 转换为十进制
如~7,因为这里涉及到第一位的正负问题,所以将二进制格式写全
- 7的二进制:-------------------------
0000 0000 0000 0000 0000 0000 0111 - 上述取反得到:----------------------
1111 1111 1111 1111 1111 1111 1000,得到补码 - 补码减1得到反码,-------------------
1111 1111 1111 1111 1111 1111 0111 - 符号位不变,其余位再次取反,得到真码
1000 0000 0000 0000 0000 0000 1000 - 转成二进制 -(0 + 0 + 0 + 8) = -8
简便算法:~A 将数字取反再减去1得到结果,如~6 -> -6-1 = -7 或~-2 -> 2-1 = 1
小数取整 ~~
投机技巧:如~~3.6 -> 3
原理:先对3.6做非运算~3.6 -> -4,然后对-4做非运算~-4 -> 得到3
异或运算 ^
例:A ^ B,计算机运算步骤:
- 将A 和 B 分别转换为二进制数a和b
- 将a和b同位比较
- 不同为1
- 相同为0
如5 ^ 9
- 5的二进制:0101
- 9的二进制:1001
得到结果:1100 = 0 + 0 + 4 + 8 = 12
左位移 <<
例:A << B,代表将A的二进制向左移动B位,后面补相同个0。
如:5 << 2
- 5的二进制:0000 0101
- 向左移动两位,0001 0100 = 0+0+4+0+16 = 20
结果:
规律总结:5 << 2 = 5(数字A) ✖️ 2的2(数字B)次方 = 20
右位移 >>
例:A >> B,将A的二进制向右移动B位,前面补相同的0
如:5 >> 2
- 5的二进制:0000 0101
- 向右移动两位,0000 0001 = 1
结果:
全右位移 >>>
同右位移写法,但是符号位也会跟随移动,前面补0 如-1 >>> 30
- -1的二进制:1111 1111 1111 1111 1111 1111 1111 1110
- 右位移30位:0000 0000 0000 0000 0000 0000 0000 0011
结果: