题解 | #不用加减乘除做加法#
不用加减乘除做加法
https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215
基本原理:加法是线性算子;加法和异或运算逻辑类似,进位和与运算逻辑类似。
基本公式:a + b = a ^ b + a & b。
先不考虑进位,直接异或,之后再把进位的结果加上。
因为是线性算子,所以这是合理的。
循环终止条件:进位为0,即,不进位的情况下,加法 = 异或。
python需要考虑的事情:
python是没有变量长度之分的。python对负数作位运算需要提前截断掉高位,否则会超时/越界。
python最大的正整数的补码是0x7FFFFFFF(可自行通过max_value = sys.maxsize获取),更大数就要以2^30为基分开存储尾数啦,不细说。
本题最大正值2000 =0x7D0。取12位足够了,用来截断更高位。
(当然,也可以取更大点啦。确保最大正值比board低至少一位就行。这样的话如果是负数,高位一定是1,而又因为截断了,所以更高位“是0”,“看起来”就是正数,也就大于最大正值了。所以只要比最大正值大,那就是负数啦。)
class Solution: def Add(self, num1: int, num2: int) -> int: board = 0xFFF num1, num2 = num1 & board, num2 & board while num2 != 0: num1, num2 = num1 ^ num2, (num1 & num2) << 1 & board return num1 if num1 <= 0x7D0 else ~(num1 ^ board)