【題目】
給出兩個整數a和b, 求他們的和, 但不能使用 + 等數學運算符。
【注意事項】
你不需要從輸入流讀入數據,只需要根據aplusb的兩個參數a和b,計算他們的和並返回就行。
【說明】
1、a和b都是 32位 整數麼?
- 是的
2、我可以使用位運算符麼?
- 當然可以
【樣例】
如果 a=1 並且 b=2,返回3
【解題報告】
考察算法:模擬+二進制位運算
在十進制加法中可以分爲如下3步進行:
1. 忽略進位,只做對應各位數字相加,得到12(個位上5+7=12,忽略進位,結果2);
2. 記錄進位,上一步計算中只有個位數字相加有進位1,進位值爲10;
3. 按照第1步中的方法將進位值與第1步結果相加,得到最終結果22。
下面考慮二進制數的情況(5=101,17=10001):
仍然分3步:
1. 忽略進位,對應各位數字相加,得到10100;
2. 記錄進位,本例中只有最後一位相加時產生進位1,進位值爲10(二進制);
3. 按照第1步中的方法將進位值與第1步結果相加,得到最終結果10110,正好是十進制數22的二進制表示。
接下來把上述二進制加法3步計算法用位運算替換:
第1步(忽略進位):0+0=0,0+1=1,1+0=0,1+1=0,典型的異或運算。
第2步:很明顯,只有1+1會向前產生進位1,相對於這一數位的進位值爲10(二進制),而10=(1&1)<<1。
第3步:將第1步和第2步得到的結果相加,其實又是在重複上述2步,直到不再產生進位爲止。
【AC-Code】
int aplusb(int a,int b)
{
if(a==0)return b;
if(b==0)return a;
intx1 = a^b;
intx2 = (a&b)<<1;
returnaplusb(x2,x1);
}