Skip to content

Python 位运算符

位运算符对整数的二进制位进行运算。操作数会被视为无限长度的二进制补码整数(与 Python int 的语义一致),运算结果仍为 int(以十进制显示)。它们与 逻辑运算符and / or / not)不同:后者做的是真值组合,不是按位操作。

位运算符通常只用于整数;更多运算符总览见 运算符

运算符一览

含义符号示例
按位与&x & y
按位或|`x
按位异或^x ^ y
按位取反~~x
左移<<x << n
右移>>x >> n

(左移、右移右侧 n 应为非负整数;具体规则见下文。)

&(按位与)

两位都为 1 时该位为 1,否则为 0

示例(为便于阅读,只写出低 4 位;高位补 0):

  • 50101
  • 40100
  • 5 & 40100 → 十进制 4

|(按位或)

任一位为 1 则该位为 1

  • 0101 | 010001015

^(按位异或)

两位不同1相同0

  • 0101 ^ 010000011

~(按位取反)

在 Python 中,对整数 x 有恒等关系:

text
~x == -x - 1

例如 ~5 == -6。这与「固定宽度二进制补码」的直观一致,但 Python 的整数没有固定位宽,按无限符号位扩展理解即可。

<<(左移)

把位向左移动 n 位,右侧补 0。对非负整数,x << n 等价于 x * (2 ** n)(在结果仍为整数的前提下)。

  • 7 << 114

>>(右移)

把位向右移动 n 位。对非负整数,相当于向下取整除以 2 ** n(2 的 n 次方)。对负数,Python 的右移是算术右移(符号位延伸),结果仍向 −∞ 方向取整。

  • 10 >> 15
  • -10 >> 1-5

左移在绝对值过大时可能非常耗时或占用大量内存,需注意。

综合示例

python
a = 5
b = 6

print("a & b =", a & b)
print("a | b =", a | b)
print("~a =", ~a)
print("a ^ b =", a ^ b)

c = 10
d = -10

print("c >> 1 =", c >> 1)
print("d >> 1 =", d >> 1)

c = 5
d = -10

print("c << 1 =", c << 1)
print("d << 1 =", d << 1)

输出:

text
a & b = 4
a | b = 7
~a = -6
a ^ b = 3
c >> 1 = 5
d >> 1 = -5
c << 1 = 10
d << 1 = -20

复合赋值

与算术类似,可有 &=|=^=<<=>>=,含义为对左操作数原地按位运算再赋值。

小结

  • &|^~ 为按位逻辑;<<>> 为移位,注意负数右移语义。
  • and / or 不同;不要混淆 &and|or

参考