大佬题解:
class Solution:
def add(self, a: int, b: int) -> int:
"""
若补码 a 为负数( 0x7fffffff 是最大的正数的补码 ),需执行 ~(a ^ x) 操作,将补码还原至 Python 的存储格式。 a ^ x 运算将 1 至 32 位按位取反; ~ 运算是将整个数字取反;因此, ~(a ^ x) 是将 32 位以上的位取反,1 至 32 位不变。
"""
x = 0xffffffff
# 先将每个数字取反
a,b = a & x, b & x
# 当进位为0时跳出 a是非进位和(异或操作) b是进位(与操作+移位操作)
while b!=0:
a,b = (a^b),(a & b)<<1 & x
return a if a<=0x7fffffff else ~(a^x)
"""
Java写法:
while(b != 0) { // 当进位为 0 时跳出
int c = (a & b) << 1; // c = 进位
a ^= b; // a = 非进位和
b = c; // b = 进位
}
return a;
"""