位运算
针对于内存的bit进行数据计算。
内存按二进制存储 ,0或1.
&:按位与 1 & 1==》1 ,否则0
|:按位或 0 | 0==》0 ,否则1
^:相同的0,不同得1
>>:右移n位 = 除以2的n次方,往小取整
<<:左移n位=乘以2的n次方
位运算的难点:负数的位移。
对于负数来说,实际在内存中,以“补码”形式存储。
反码:最高符号位不变,其他取反
补码=反码+1
5:
00000…0101 对于正数来说,原码、反码和补码是一致的
-5:
10…0101 :原码
111111…1010: 反码
111111…1011:补码 --在内存中的真实存储。
所有的负数位运算,都基于补码,算完后再计算出原码。
-5>>2:
右移后的新补码: 11111111…10 [11]
新反码(补码-1): 111111111101
新原码: 100000000010 ==>-2
-5<<2:
左移后的新补码: 1111111101100 ,左移用0补
新反码: 1111111101011
新原码: 1000000010100,==>十进制的?-20
假设原来的补码:1001111101100=左移两位–>01111101100[00]
左移可能让绝对值很大的负数–>正数!
位运算的好处:效率极高
3和2怎么计算可最快获得12? 3<<2。归并排序的位运算实现。