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))

 

posted @ 2021-03-31 19:39  ISGuXing  阅读(124)  评论(0编辑  收藏  举报