JZ48 不用加減乘除做加法

2021-10-11 18:07:41 字數 1163 閱讀 7918

寫乙個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算符號。

位運算表

加法位運算對照表

參考:解析①:

首先看十進位制是如何做的: 5+7=12,三步走

第一步:相加各位的值,不算進製,得到2。

第二步:計算進製值,得到10. 如果這一步的進製值為0,那麼第一步得到的值就是最終結果。

第三步:重複上述兩步,只是相加的值變成上述兩步的得到的結果2和10,得到12。

同樣我們可以用三步走的方式計算二進位制值相加: 5-101,7-111

第一步:相加各位的值,不算進製,得到010,二進位制每位相加就相當於各位做異或操作,101^111。

第二步:計算進製值,得到1010,相當於各位做與操作得到101,再向左移一位得到1010,(101&111)<<1。

第三步重複上述兩步, 各位相加 010^ 1010=1000,進製值為100=(010&1010)<<1。

繼續重複上述兩步:1000^100 = 1100,進製值為0,跳出迴圈,1100為最終結果。

解析②:

(1)十進位制加法分三步:(以5+17=22為例)

只做各位相加不進製,此時相加結果為12(個位數5和7相加不進製是2,十位數0和1相加結果是1);

做進製,5+7中有進製,進製的值是10;

將前面兩個結果相加,各位想加得12+10=22(即1+1=2.2+0=2),進製為0

(2)這三步同樣適用於二進位制位運算

1.不考慮進製對每一位相加。0加0、1加1結果都是0,0加1、1加0結果都是1。這和異或運算一樣;

2.考慮進製,0加0、0加1、1加0都不產生進製,只有1加1向前產生乙個進製。可看成是先做位與運算,然後向左移動一位;

3.相加過程重複前兩步,直到不產生進製為止。

class

solution

return num1;}}

;

JZ48 不用加減乘除做加法

劍指offer上遇到的乙個題,還蠻有意思的。演算法描述 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。解題思路 看到不用四則運算符號的時候第一反應就是將其轉化為二進位制的位運算。在計算機中,整數n是用補碼進行儲存的 補碼 如果n為正數,則原碼 反碼 補碼,如果n為負數,則補碼 反...

JZ48 不用加減乘除做加法

題目描述 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。題解 不用加減乘除的加法運算,需要用到位運算。1 將兩數異或 異或0 0 0 0 0 0 10 1 1 1 01 0 1 1 11 1 0 答案錯誤 我們從以上 可以看出,當涉及到進製時結果就會錯誤,所以我們需要處理進製。2...

JZ48 劍指offer 不用加減乘除做加法

題目描述 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。class solution return num1 class solution def add self,a int,b int int x 0xffffffff a,b a x,b x while b 0 a,b a ...