題目描述:https://leetcode.com/problems/sum-of-two-integers/?tab=Description
題目分析:不用+、-來實現加法運算。那麼可以像計算機硬件一樣使用位運算來實現。
- 二進制的加法有兩部分:相加,進位:
- 各位相加的結果,是“異或:^”;各位的進位是“且:&”,因爲進位是放在下一位的,所以要左移一位
- 所以,a+b = x1+c1。其中x1 = a ^ b, c1 = (a & b) <<1
- 各位相加的結果,是“異或:^”;各位的進位是“且:&”,因爲進位是放在下一位的,所以要左移一位
- 但是在這種情況下,還是要使用加法。可以考慮遞歸地調用上述方法
- 觀察c1,可以發下,c1的最後一位一定爲0。
- a + b = x + c1 = x1 + c1 = x2 + c2,這裏C2的最後2位,也一定是0.以此類推,第n次遞歸,最後n位是0.
- 最終一定會出現一個cn,全都是0。也就是沒有進位,所以,遞歸的出口,就是b==0;
- 觀察c1,可以發下,c1的最後一位一定爲0。
public class Solution {
public int getSum(int a, int b) {
if(b==0){
return a;
}
int result = a ^ b;
int carray = (a & b) << 1;/
return getSum(result, carray);
}
}