寫乙個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算符號。
對於數字運算,如果說四則運算不能用的話,那麼我們只能用位運算來做了。
我們以 5 + 17 為例 結果為 22,那麼 22 的計算結果,我們可以分為三步 來進行:
第一步: 只做各位相加不進製 也就是說 沒一位上的數字 相應的來相加 但是不進製,那麼 5 + 7 為 12
個位數 5 和 7 相加 不進製 是2 十位是0 和1 相加 為 1
第二步: 5 + 7 中有進製,進製值 是10 ;
第三步: 把前面兩個結果 加起來: 12 + 10 = 22
以上為我們用十進位制計算的 策略,那麼 我們用於位運算中是不是也合適,我們來舉個栗子:
還是以 5 + 17 為例,那麼 5 的二進位制是101 ; 17 的二進位制是 10001;
第一步:各位相加 但不進製: 101 + 10001 = 10110 不進製的話 結果為 10100 (最後一位兩個數都是1,相加的結果需要進製,但是這一位不進製,意味著結果仍然是0)
第二步: 記下進製,它只在最後一位相加時產生了乙個進製。
第三步: 把前面兩個結果相加,得到的結果是 10110.
那麼現在我們把前面的 二進位制的加法用位運算來替代的話
第一步的 求 和 運算就是 不考慮 進製的話,對每一位來相加,0 和0 以及 1 和1 的結果都是0 , 0+1 或者 1+0 的結果 都是1;那麼我們會看出它與我們學過的異或運算相同,就是相同為假,不同為真,所以叫 異 或 xor 。
第二步: 對0 加 0、1加0、0加1 而言,都不會產生進製,只有1+1 的時候,會產生乙個進製。此時 我們可以想象成兩個數 先做了乙個 位 與 & 運算,然後再向 左移 一位。只有兩個數是1 的時候,位與 & 得到的結果是 1,其餘的都是0。
第三步:把前面兩個步驟的結果再相加,然後在繼續判斷是否有進製,直到沒有進製為止,那麼此時的相加的過程,依然是重複前面的兩步,直到不產生進製為止。
:#第一種**:迴圈。簡潔但是原理相同,那麼我們以下面第二段**為例;來解析。
# while (num2):
# num1, num2 = (num1 ^ num2) & 0xffffffff, ((num1 & num2) << 1) & 0xffffffff
# return num1 if num1 <= 0x7fffffff else ~(num1 ^ 0xffffffff)
#第二種**:
#首先兩個數做 乙個 異或 運算^ 那就是 在不進製的情況下,讓兩個相加 求和。
xornum = num1 ^ num2
#讓兩個數 做 位與 操作,然後再向 左 移 一位,得到它 向前進製的值。
andnum =
(num1 & num2)
<<
1#判斷,當 進製 的值不等於0 的時候,說明 一直有進製,也就是 過程沒有結束。
while andnum !=0:
#那麼我們就繼續上面的操作。但是這次的 數值 改為上次的兩個結果,
#乙個 是異或的結果,乙個是 與 操作 & 以後 左移一位的 結果。
tmp1 = xornum ^ andnum
tmp2 =
(xornum & andnum)
<<
1#因為如果這個數為負數的話,那麼負數 左移 一位與正數 不同,負數 是數值變小,正數 數值變大
#如果是正數的話那麼這一步就 不變,如果是負數的話,這一步就對負數來起作用。
#對於python來說 負數的 二進位制 可能會有無數個1,我們用這個方法讓它變成乙個可數的數字長度。
tmp1 = tmp1 &
0xffffffff
xornum = tmp1
andnum = tmp2
#乙個負整數(或原碼)與其補數(或補碼)相加,和為模。 0xffffffff
# ~(xornum ^ 0xffffffff) 這個是 異或數 與 模 來 異或,最後 按位 取反 來求得 負數的補碼。
return xornum if xornum <=
0x7ffffff
else
~(xornum ^
0xffffffff
)
不用加減乘除做加法
author 過路的守望 思路 i 先將各bit位相加,不計進製,這一步可以用m n實現 ii 加上進製,進製如何來,用m n可以得到m和n中都為1的bit位,而不全為1的位則全部變為了0,該位相加會發生進製,使得左邊一位加1,因此 m n 1邊可得到進製後要加的1的位置 iii 將前面兩步的結果相...
不用加減乘除做加法
首先看十進位制是如何做的 5 7 12,三步走 第一步 相加各位的值,不算進製,得到2。第二步 計算進製值,得到10.如果這一步的進製值為0,那麼第一步得到的值就是最終結果。第三步 重複上述兩步,只是相加的值變成上述兩步的得到的結果2和10,得到12。同樣我們可以用三步走的方式計算二進位制值相加 5...
不用加減乘除做加法
package demo 題目描述 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。public class offer 30 return num1 if num1 0 num2 0 num1 num2 return num1 注意這裡每個if語句都要有返回值,否則每個迴圈會依次...