Python 位运算符
位运算符对整数的二进制位进行运算。操作数会被视为无限长度的二进制补码整数(与 Python int 的语义一致),运算结果仍为 int(以十进制显示)。它们与 逻辑运算符(and / or / not)不同:后者做的是真值组合,不是按位操作。
位运算符通常只用于整数;更多运算符总览见 运算符。
运算符一览
| 含义 | 符号 | 示例 |
|---|---|---|
| 按位与 | & | x & y |
| 按位或 | | | `x |
| 按位异或 | ^ | x ^ y |
| 按位取反 | ~ | ~x |
| 左移 | << | x << n |
| 右移 | >> | x >> n |
(左移、右移右侧 n 应为非负整数;具体规则见下文。)
&(按位与)
两位都为 1 时该位为 1,否则为 0。
示例(为便于阅读,只写出低 4 位;高位补 0):
5→01014→01005 & 4→0100→ 十进制4
|(按位或)
任一位为 1 则该位为 1。
0101 | 0100→0101→5
^(按位异或)
两位不同为 1,相同为 0。
0101 ^ 0100→0001→1
~(按位取反)
在 Python 中,对整数 x 有恒等关系:
text
~x == -x - 1例如 ~5 == -6。这与「固定宽度二进制补码」的直观一致,但 Python 的整数没有固定位宽,按无限符号位扩展理解即可。
<<(左移)
把位向左移动 n 位,右侧补 0。对非负整数,x << n 等价于 x * (2 ** n)(在结果仍为整数的前提下)。
7 << 1→14
>>(右移)
把位向右移动 n 位。对非负整数,相当于向下取整除以 2 ** n(2 的 n 次方)。对负数,Python 的右移是算术右移(符号位延伸),结果仍向 −∞ 方向取整。
10 >> 1→5-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。