You need to enable JavaScript to run this app. Python中负数与二进制数做&、|位运算后输出表示不对称原因
优惠活动
大模型
产品
解决方案
定价
更多

Python中负数与二进制数做&、|位运算后输出表示不对称原因

Python位运算与二进制格式化规则说明

这个不对称现象本质是Python任意精度整数的补码表示规则和b格式符的输出逻辑共同导致的,和位运算本身是&还是|没有直接关系。


1. 位运算的底层逻辑

Python的整数采用任意长度的补码表示:负数的补码高位无限补1,正数的补码高位无限补0,所以几个运算数的底层形式为:

  • -5的补码为...11111011
  • 0b1111是无符号4位正数,等价于...00001111
  • 0b0000等价于...00000000

例1:print(f"{-5 & 0b1111: 04b}")输出1011

按位&运算要求对应位都为1才得1,所以...11111011 & ...00001111的结果是...00001011,也就是十进制正数11。
正数用b格式符输出时不带负号,按要求补前导空格+4位二进制就是 1011,忽略前导空格的显示结果就是1011,和补码运算的位结果完全一致。

例2:print(f"{-5 | 0b0000: 04b}")输出-101

按位|运算要求对应位有1就为1,所以...11111011 | ...00000000的结果还是...11111011,也就是十进制负数-5。
负数用b格式符输出时,Python不会直接输出补码,而是先输出负号,再输出对应绝对值的二进制:5的二进制是101,加上负号总长度刚好4位,所以输出-101。

例3:print(f"{-5 | 0b1111: 04b}")输出-001

按位|运算后...11111011 | ...00001111的结果是...11111111,也就是十进制负数-1。
按照负数的b格式输出规则:负号占1位,剩下3位补前导零凑够4位总长度,绝对值1的二进制补零后为001,所以最终输出-001。


2. "不对称"的真相

你观察到的不对称和位运算类型无关,本质是位运算结果的正负性决定了输出格式:

  • 如果位运算结果是正数,b格式直接输出二进制原码,和补码运算的位结果一致
  • 如果位运算结果是负数,b格式会输出负号+绝对值的二进制,自然和补码的位表现不一样

如果需要负数也输出固定位数的补码形式,可以先把结果和对应位宽的全1数做&运算截断为正数再输出,比如print(f"{(-5 | 0b0000) & 0xf:04b}")就会输出1011,和补码运算结果完全一致。

内容的提问来源于stack exchange,提问作者LAKSHYA SINGH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 08:06:00