Python正负整数混合XOR异或运算的结果逻辑疑问
问题核心原因
异或运算确实是严格逐位执行计算的,你得到不符合预期的结果,核心是对Python中带符号整数的比特表示规则理解有偏差:
- Python的整数没有固定位宽,采用无限前导扩展的补码存储,不存在单独占1位的“符号位”
- 你默认
-0b0010和0b0010只有符号位不同、其余数值位完全一致,这个前提不成立,二者的高位比特完全不同,异或结果自然不会只差符号。
逐次运算拆解
1. 正数异或:0b0001 ^ 0b0010
两个数都是正整数,正整数的补码高位全为前导0:
1的比特序列:...00000001(无限个前导0,最低位为1)2的比特序列:...00000010(无限个前导0,次低位为1)
逐位异或后得到的比特序列为...00000011,对应十进制的3,因此bin(3)输出0b11,和你的预期一致。
2. 正负数异或:0b0001 ^ -0b0010
补码规则下,负整数-n的比特表示可以理解为:对应正整数n的所有位按位取反后加1,放到无限位宽场景下,负数的高位全为前导1:
-2的比特序列:...11111110(无限个前导1,最后两位为10)- 再和
1的比特序列...00000001逐位异或:
所有高位为1 ^ 0 = 1,最后两位为1^0=1、0^1=1,最终得到全1的比特序列...11111111
全1的补码序列对应十进制的-1,而Python的bin()函数处理负数时不会输出无限个前导1,只会简化显示为负号加对应绝对值的二进制,因此输出-0b1。
补充验证
你可以通过位与操作截断高位查看负数的实际低比特,比如执行-2 & 0b111,会得到结果6也就是0b110,能直接看出-2的低三位是110,而非你预想的“符号位1+数值位010”。
内容的提问来源于stack exchange,提问作者Jonathan Schoreels
相关产品推荐
相关产品推荐

