【lintcode】1、A+B問題【位運算】

【題目】

給出兩個整數ab, 求他們的和, 但不能使用 + 等數學運算符。

【注意事項】

你不需要從輸入流讀入數據,只需要根據aplusb的兩個參數ab,計算他們的和並返回就行。

【說明】

1ab都是 32 整數麼?

  • 是的

2、我可以使用位運算符麼?

  • 當然可以

【樣例】

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

【解題報告】

       考察算法:模擬+二進制位運算

在十進制加法中可以分爲如下3步進行:
   1. 忽略進位,只做對應各位數字相加,得到
12(個位上5+7=12,忽略進位,結果2);
   2. 記錄進位,上一步計算中只有個位數字相加有進位
1,進位值爲10;
   3. 按照第
1步中的方法將進位值與第1步結果相加,得到最終結果22。

下面考慮二進制數的情況(51011710001):
  仍然分
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);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章