&的奇怪行为和^在python 2.7中

时间:2017-08-14 21:49:12

标签: python python-2.7 twos-complement

以下是我的代码,并想知道为什么两种情况都有不同的结果?实际上我期望第一行输出-1,因为位AND 0xffffffff不会改变任何东西。我希望第二行输出1,因为位XOR 0xffffffff意味着位NOT(在Python中为~,并且添加另一个1应该得到-1的二进制补码值,即1)

print -1 & 0xffffffff # output 4294967295
print -1 ^ 0xffffffff + 1 # output -4294967297

1 个答案:

答案 0 :(得分:4)

Python以任意精度实现整数。执行逐位运算时,正数被视为具有无限序列的高阶0位,而负数则表现为具有无限高阶1位序列。特别是,-1数字就像1的无限序列。

所以我们有第一次计算

    ...11111111111111111111111111111111111111111111111111111111
  & ...00000000000000000000000011111111111111111111111111111111
  = ...00000000000000000000000011111111111111111111111111111111

由于高位中有0,因此结果为正。

第二个计算是:

    ...11111111111111111111111111111111111111111111111111111111
  ^ ...00000000000000000000000100000000000000000000000000000000 (this is 0xffffffff + 1 = 0x100000000)
  = ...11111111111111111111111011111111111111111111111111111111

由于高位中有1,因此结果为负。