1. 程式人生 > >【Lintcode】A+B問題

【Lintcode】A+B問題

題目描述:
給出兩個整數a和b, 求他們的和, 但不能使用 + 等數學運算子。

注意事項
你不需要從輸入流讀入資料,只需要根據aplusb的兩個引數a和b,計算他們的和並返回就行。

說明:
a和b都是 32位 整數麼?
是的

我可以使用位運算子麼?
當然可以

樣例
如果 a=1 並且 b=2,返回3

思路:既然提示使用位運算,那麼我們肯定首選用位運算。以5+17為例:
在二進位制中(5=101,17=10001)分3步:
1. 忽略進位,對應各位數字相加,得到10100;
2. 記錄進位,本例中只有最後一位相加時產生進位1,進位值為10(二進位制);
3. 按照第1步中的方法將進位值與第1步結果相加,得到最終結果10110,正好是十進位制數22的二進位制表示。

也就是說:
第1步,我們採用異或去忽略進位,得到忽略進位後每位的結果:0+0=0,0+1=1,1+0=0,1+1=0
第2步:很明顯,只有1+1會向前產生進位1(10=(1&1)<<1),接著去計算進位的值,繼而和第一步得到的結果進行相加。
第3步:將第1步和第2步得到的結果相加,其實又是在重複這個過程,直到不再產生進位為止。

int aplusb(int a, int b) 
{
    // write your code here
    if (a == 0) return b;
    if (b == 0) return a;
    int x = a ^ b;
    int
y = (a&b) << 1; return aplusb(x, y); }