经常有一些题目的模拟题会结合位运算考察模拟能力,如果位运算能力不过关往往会被位运算本身所缠住。这在python这种语言使用者上应该问题更大,因为有强大的类库解决各类计算问题,实际很少用到低层的位运算,甚至对整数的二进制api一无所知导致连两数异或这样的操作也得自己写,不仅性能可能有问题,而且非常浪费时间。因此在这里补强一下位运算。

整数在计算机中是以二进制的形式表示的,二进制的每位数字都是0或1。位运算是把数字用二进制表示后,对每位上0或1的运算。位运算只有6种:非、与、或、异或、左移和右移,在python中几乎都有现成的简明实现。

位运算名称 作用 Python用法 示例
非 (NOT) 按位取反,将0变1,1变0 ~ ~5 结果为 -6
与 (AND) 按位与操作,两位都为1时为1 & 5 & 3 结果为 1
或 (OR) 按位或操作,只要有一位为1即为1 | 5 | 3 结果为 7
异或 (XOR) 按位异或,相同为0不同为1 ^ 5 ^ 3 结果为 6
左移 (<<) 将位向左移,低位补0 << 5<<1 结果为 10
右移 (>>) 将位向右移,高位补符号位 >> 5>>1=2 结果为 2

PS:左移低位补0,右移高位是补符号位!

在计算机中,二进制数通过符号位来区分正数和负数。常用的表示方法是补码。规则如下:

  • 正数:最高位为0。例如,二进制的 00000101 表示十进制的 5
  • 负数:最高位为1。负数使用补码表示,负数的补码通过将数值的二进制取反再加1得到。例如,十进制 -5 的补码为 11111011

这样可以方便地进行加减运算,并且确保计算结果的符号正确。

注意,负数运算是补码进行位运算,补码是在反码的基础上+1,转换回去也是类似的。