
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 左侧),而是统一右对齐后比较:
立即学习“Python免费学习笔记(深入)”;
❌ 错误理解(左对齐/字符串式对齐):
这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)
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,而是严格遵循“右对齐 + 逐位与”的底层规则。掌握这一对齐逻辑,是正确使用 &、|、^、> 等位运算符的基础。









