位运算学习笔记

115 阅读3分钟

位运算

参考:blog.csdn.net/m0_67502005…

位运算是计算机将数据转换成二进制后做的计算。

计算机将数字转换成二进制时,如果是小数会先将小数转换为整数后再转为二进制格式,第一位代表符号位,正数是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,计算机操作步骤:

  1. 将 A 和 B 转为二进制数 a 和 b
  2. 将 a 和 b 做与运算,同位比较
  • 如都为1,返回1
  • 都为0,返回0
  • 一个1一个0,返回0

如2 & 4
2的二进制:0010
4的二进制:0100

结果为0000=0 image.png

或运算 |

例:A | B,计算机操作步骤:

  1. 将 A 和 B 转为二进制数 a 和 b
  2. 将 a 和 b 做或运算,同位比较
  • 都为0,返回0
  • 都为1,返回1
  • 一个0一个1,返回1

如3 | 5 3的二进制:0011 5的二进制:0101

结果为0111= 1 + 2 + 4 = 7 image.png

非运算 ~

例:~A,计算机操作步骤:

  1. 将A转换成二进制数a,拿出真码
  2. 对a各个位取反,0->1,1->0,得到补码
  3. 补码减1得到反码
  4. 符号位不变,其余位再次取反,得到真码
  5. 转换为十进制

如~7,因为这里涉及到第一位的正负问题,所以将二进制格式写全

  1. 7的二进制:-------------------------0000 0000 0000 0000 0000 0000 0111
  2. 上述取反得到:----------------------1111 1111 1111 1111 1111 1111 1000,得到补码
  3. 补码减1得到反码,-------------------1111 1111 1111 1111 1111 1111 0111
  4. 符号位不变,其余位再次取反,得到真码1000 0000 0000 0000 0000 0000 1000
  5. 转成二进制 -(0 + 0 + 0 + 8) = -8image.png

简便算法:~A 将数字取反再减去1得到结果,如~6 -> -6-1 = -7 或~-2 -> 2-1 = 1

小数取整 ~~

投机技巧:如~~3.6 -> 3

原理:先对3.6做非运算~3.6 -> -4,然后对-4做非运算~-4 -> 得到3

异或运算 ^

例:A ^ B,计算机运算步骤:

  1. 将A 和 B 分别转换为二进制数a和b
  2. 将a和b同位比较
  • 不同为1
  • 相同为0

如5 ^ 9

  1. 5的二进制:0101
  2. 9的二进制:1001

得到结果:1100 = 0 + 0 + 4 + 8 = 12 image.png

左位移 <<

例:A << B,代表将A的二进制向左移动B位,后面补相同个0。

如:5 << 2

  1. 5的二进制:0000 0101
  2. 向左移动两位,0001 0100 = 0+0+4+0+16 = 20

结果:image.png

规律总结:5 << 2 = 5(数字A) ✖️ 2的2(数字B)次方 = 20

右位移 >>

例:A >> B,将A的二进制向右移动B位,前面补相同的0

如:5 >> 2

  1. 5的二进制:0000 0101
  2. 向右移动两位,0000 0001 = 1

结果:image.png

全右位移 >>>

同右位移写法,但是符号位也会跟随移动,前面补0 如-1 >>> 30

  1. -1的二进制:1111 1111 1111 1111 1111 1111 1111 1110
  2. 右位移30位:0000 0000 0000 0000 0000 0000 0000 0011

结果:image.png