LeetCode:不用加号的加法(位运算)
解题思路:位运算,只能用位运算符。a、b同号比较好处理。主要是异号的情况,考虑 a>0,b<0,因为 a,b的绝对值都不会超过2^32,因此取模数为2^32。根据同余方程可知 (a+b)%mod = (a+(mod+b))%mod,mod+b即为负数b在mod下的补码:b & int('1'*32,2)。
如果(a+(mod+b)) > mod说明a+b为正数;否则a+b为负数,如果是负数,~(ans ^ int('1'*32,2)),ans是(a+(mod+b))。
感觉这道题属于计算机组成原理,计算补码部分也是笔者从其他地方找到的,不知道python是怎么执行的。特此记录本题
1 class Solution: 2 def sum(self,a,b): 3 while b: 4 z1 = a^b 5 z2 = (a&b)<<1 #都为1需要进位 6 a = z1 7 b = z2 8 return a 9 def get_bu(self,x): 10 # if x<0 :|x|+get_bu(x)==mod 11 # else :get_bu(x) = x 12 return x&int('1'*32,2) 13 14 def add(self, a: int, b: int) -> int: 15 if a>=0 and b>=0: 16 return self.sum(a,b) 17 elif a<0 and b<0: 18 return self.sum(a,b) 19 elif a<0: 20 a = self.get_bu(a) 21 else: 22 b = self.get_bu(b) 23 24 ans = self.sum(a, b) 25 if (ans>>32) & 1: 26 return ans^(1<<32) 27 else: 28 return ~(ans^int('1'*32,2))