我已经苦苦挣扎了 4 个小时,试图理解为什么我们在评估 ~(a ^ mask)
时 a
超过 32 位数字最大值 0x7fffffff
时做 a + b
。
我明白为什么我们要掩盖每一个 (a & b) << 1
和 a ^ b
。我们这样做是因为在 Python 中,负数的 2s 补码需要无限位。因此我们将迭代无限次。我也明白 (a & b) << 1
在做加法时处理向前移动进位 1 位。我明白 a ^ b
处理总和而不带进位。
我不明白的是,为什么我们在返回答案时需要再次屏蔽 a
?为什么用 ^
(XOR) 和 &
(AND) 掩码?
退出循环时它已经被屏蔽了:a = (a ^ b) & mask
。那么,如果 ~a
设置为 32nd bit
for 1
,为什么我们不能只做 a
呢?
我认为的一个解释是,如果 a
是负数(当我们退出循环时),那么它的二进制补码中将有无限个 1,我们需要将其屏蔽。但是当我打印 a
时,它是一个有限 1 的正数。我想这是预料之中的,因为我们 掩盖它。
看了Python中Bit-wise NOT的含义,理解~操作,但是没看懂
我的代码:
def getSum(self, a: int, b: int) -> int:
# 32bit mask
mask = 0xFFFFFFFF # 8Fs = all 1s for 32 bits
while True:
a, b = (a ^ b) & mask, ((a & b) << 1) & mask
if b == 0:
break
# return a
max_int = 0x7FFFFFFF
print("A:", a)
print("Bin A:", bin(a))
print("Bin M:", bin(mask))
print(" A^M:", bin(a ^ mask))
print("~ A^M:", bin(~(a ^ mask)))
print(" ~ A:", bin(~a))
return a if a < max_int else ~(a ^ mask)
为 a = -12
, b = -8
输出:
A: 4294967276
Bin A: 0b11111111111111111111111111101100
Bin M: 0b11111111111111111111111111111111
A^M: 0b10011
~ A^M: -0b10100
~ A: -0b11111111111111111111111111101101