Python 中按位与运算符(&)的对齐规则详解

python 的按位与运算符 `&` 对两个整数进行逐位比较时,会将二进制数**右对齐、左补零**,而非按字符串长度对齐;因此 `14 & 16` 实际比较的是 `01110 & 10000`,所有对应位均无同时为 1 的情况,结果为 0。

在 Python 中,按位与(&)是逐位逻辑运算:仅当两个操作数在同一比特位上都为 1 时,结果在该位才为 1;否则为 0。关键在于——位对齐方式是右对齐(least-significant-bit aligned),即从最低位(2⁰ 位)开始对齐,高位不足则自动补零。

以 14 & 16 为例:

  • 14 的二进制表示为 0b1110 → 实际存储为 ...00001110(无限前导零)
  • 16 的二进制表示为 0b10000 → 实际存储为 ...00010000

右对齐后逐位对比(我们只展示必要位宽,共 5 位即可):

    14 →  01110  
    16 →  10000  
         -----  &
    结果 → 00000  → 十进制为 0

注意:不是将 1110 和 10000 按字符串左对齐(如 1110 对齐到 10000 左侧),而是统一右对齐后比较:

❌ 错误理解(左对齐/字符串式对齐):

  1110   ← 4 位
 10000   ← 5 位  
→ 若强行左对齐并截断 → 1110 & 1000 = 1000 (8),但这完全违背 Python 规则。

✅ 正确方式(右对齐 + 零扩展):

     14: ...00001110  
     16: ...00010000  
AND (&): ...00000000  → 0

你可以用 bin() 验证对齐效果:

>>> bin(14)
'0b1110'
>>> bin(16) 
'0b10000'
>>> bin(14 & 16)
'0b0'  # 即 '0b0',等价于 0

再看一个有非零结果的例子,加深理解:

>>> 14 & 12
12
>>> bin(14), bin(12)
('0b1110', '0b1100')
# 右对齐:
#   14 → 1110  
#   12 → 1100  
#       ---- &
#       1100 → 12 ✅

⚠️ 注意事项:

  • 所有整数在按位运算中均视为无限长二进制补码形式(Python 使用任意精度整数,无符号扩展限制);
  • 负数参与 & 运算时,Python 使用二进制补码表示(如 -1 & 3 会得到 3),但初学者建议先掌握非负数场景;
  • 若需固定位宽对齐(如 8 位处理),可手动掩码:(a & 0xFF) & (b & 0xFF)。

总结:14 & 16 == 0 并非 bug,而是严格遵循“右对齐 + 逐位与”的底层规则。掌握这一对齐逻辑,是正确使用 &、|、^、> 等位运算符的基础。