原題
Description
Write a function that add two numbers A and B. You should not use +
or any arithmetic operators.
Clarification
Are a and b both 32-bit
integers?
- Yes.
Can I use bit operation?
- Sure you can.
Example
Given a=1
and b=2
return 3
解題
要求不用算術運算符實現加法aplusb
,可以使用位運算。
主要是用的異或運算實現。
異或 -> 不進位加法
Example
- 不需要進位的情況
2 ^ 5
2: 010
5: 101
^ -----
7: 111
- 需要進位
2 ^ 6
2: 010
6: 110
^ -----
5: 101
這里第二位計算的結果為0
是正確的,但是并沒有向上一位進。
不進位加法結果:a ^ b
與 -> 進位
接下來的問題就是獲取進位
首先知道哪些位置需要進位,需要進位的位置有個特點就是兩個數在該位都為1
,因此可以通過與運算得出。
Example
2 & 6
2: 010
6: 110
& -----
010
然后只需要把需要進位的位置左移一位就可以得到進位。
進位:a & b << 1
遞歸相加
- 通過異或運算得到了不進位加法結果為
a ^ b
- 通過與運算得到了進位為
a & b << 1
接下來只需要把這兩個數加在一起即可,這時候可以選擇遞歸調用aplusb
,問題就變為遞歸何時結束。
在進位的加法過程中,可能產生新的進位,這時繼續遞歸需要調用aplusb
。繼續這個過程,最終進位會變為0
,此時結束遞歸。
最終代碼
class Solution {
public:
/*
* @param a: An integer
* @param b: An integer
* @return: The sum of a and b
*/
int aplusb(int a, int b) {
// write your code here
if (b == 0) return a;
return aplusb(a ^ b, (a & b) << 1);
}
};