解題思路:位運算,只能用位運算子。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是怎麼執行的。特此記錄本題
1class
solution:
2def
sum(self,a,b):
3while
b:4 z1 = a^b
5 z2 = (a&b)<<1 #
都為1需要進製
6 a =z1
7 b =z2
8returna9
defget_bu(self,x):10#
if x<0 :|x|+get_bu(x)==mod11#
else :get_bu(x) = x
12return x&int('
1'*32,2)
1314
def add(self, a: int, b: int) ->int:
15if a>=0 and b>=0:
16return
self.sum(a,b)
17elif a<0 and b<0:
18return
self.sum(a,b)
19elif a<0:
20 a =self.get_bu(a)
21else
:22 b =self.get_bu(b)
2324 ans =self.sum(a, b)
25if (ans>>32) & 1:
26return ans^(1<<32)
27else:28
return ~(ans^int('
1'*32,2))
leetcode 不用加號的加法
一開始做看不懂,後來琢磨了一下,在 附近寫了注釋,這其實就是很簡單的位運算,只是需要熟練 def add a,b a 0xffffffff b 0xffffffff while b 0 終止條件 沒有進製了 carry a b 把需要進製的位顯示出來,用1表示該位需要進製 a b 第一次迴圈為求出不...
不用加號完成加法運算(2)
今天乙個小朋友問了我乙個很有意思的問題 不用加號的加法運算 大抵就是說,誒 網上有人不用 就可以實現加法喲 這個問題以前大學的時候玩過,是乙個很有意思的問題。每個人小學的時候,都學過四則運算,但是因為四則運算太簡單了,我們誰也沒有注意過我們學習的四則運算包括術式的寫法有乙個前提,就是 在十進位制中!...
不用 實現加法運算
寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。示例 輸入 a 1,b 1 輸出 2a,b 均可能是負數或 0 結果不會溢位 32 位整數 我覺得寫這個題一定要對原反補碼的機制非常熟悉,其實加減乘除本身就是我們人自己的思維,在硬體底層笨豬cpu是沒有這麼複雜的想法的,首先cpu只有...