以下是我的代码,并想知道为什么两种情况都有不同的结果?实际上我期望第一行输出-1,因为位AND 0xffffffff不会改变任何东西。我希望第二行输出1,因为位XOR 0xffffffff意味着位NOT(在Python中为~
,并且添加另一个1应该得到-1的二进制补码值,即1)
print -1 & 0xffffffff # output 4294967295
print -1 ^ 0xffffffff + 1 # output -4294967297
答案 0 :(得分:4)
Python以任意精度实现整数。执行逐位运算时,正数被视为具有无限序列的高阶0
位,而负数则表现为具有无限高阶1
位序列。特别是,-1
数字就像1
的无限序列。
所以我们有第一次计算
...11111111111111111111111111111111111111111111111111111111
& ...00000000000000000000000011111111111111111111111111111111
= ...00000000000000000000000011111111111111111111111111111111
由于高位中有0
,因此结果为正。
第二个计算是:
...11111111111111111111111111111111111111111111111111111111
^ ...00000000000000000000000100000000000000000000000000000000 (this is 0xffffffff + 1 = 0x100000000)
= ...11111111111111111111111011111111111111111111111111111111
由于高位中有1
,因此结果为负。