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