涉及到位运算的题目真是绕死了。
题目:
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
首先就想到看了是考察位运算的。之前的一道题目二进制求和 题解有些加法本质是异或运算加进位。
- 异或运算本质是无进位的加法
- 位与于运算求进位,但&之后的结果需要左移1位才行。
因为涉及到负数,所以还要规定一下int32的位数,在python中,需要取模来限定位数
- 0x100000000是 2 32 2^{32} 232用来做模值。所以能取到的最大数为 2 32 − 1 2^{32}-1 232−1
- 而题目是有符号数,涉及到负数的,所以最大值为 2 31 − 1 2^{31}-1 231−1,即0x7fffffff
- 所以最小值为0x80000000
class Solution:
def getSum(self, a: int, b: int) -> int:
MASK = 0x100000000
jinwei = (a & b) % MASK
ssum = (a ^ b) % MASK
MAX_INT = 0x7FFFFFFF
MIN_INT = MAX_INT + 1
while jinwei != 0:
jinwei = jinwei << 1
ssum, jinwei = (ssum ^ jinwei) % MASK, (ssum & jinwei) % MASK
return ssum if ssum < MAX_INT else ~((ssum % MIN_INT) ^ MAX_INT)