描述
給出兩個整數 aa 和 bb , 求他們的和。
你不需要從輸入流讀入資料,隻需要根據
aplusb
的兩個參數a和b,計算他們的和并傳回就行。
說明
a和b都是
32位
整數麼?
- 是的
我可以使用位運算符麼?
- 當然可以
樣例
樣例 1:
輸入: a = 1, b = 2
輸出: 3
樣例解釋: 傳回a+b的結果.
當然直接return a+b,沒有什麼好說的,這裡借鑒了評論區筆記裡異或的方法實作。
這裡假設我們用到兩個數 0101 (5) , 0010(2)。
#include <iostream>
#include <iomanip>
#include <string.h>
using namespace std;
int main()
{
int a = 0b0101; //用二進制指派前加 0b
int b = 0b0010;
cout<< (a ^ b) << endl;
system("pause");
}
首先兩數完成異或的結果,0111(7),毫無争議,但存在一個問題,就是這裡我們給出的例子加法剛好沒有進位。
這裡我們重新賦個新值,0101(5)和 1010(10)
#include <iostream>
#include <iomanip>
#include <string.h>
using namespace std;
int main()
{
int a = 0b0101; //用二進制指派前加 0b
int b = 0b1010;
cout<< (a ^ b) + ((a & b)<<1) << endl;
system("pause");
}
由于這裡運算是 a 異或 b = 0011 ,a 與 b = 1000,後續運算不再存在進位了,兩數加法計算後得結果。但是在實際計算中,是否需要進位是需要我們不斷判斷的。
結合上面的思路,我們可以根據國小計算加法的思路,若有進位,一步步往前進,直到進位為0。
#include <iostream>
#include <iomanip>
#include <string.h>
int add(int a, int b);
using namespace std;
int main()
{
int a = 10; //用二進制指派前加 0b
int b = 12;
cout<< add(12,10)<< endl;
system("pause");
}
int add(int a, int b)
{
int _a,_b;
while (_b != 0)
{
_a = a ^ b;
_b = (a & b) << 1;
a = _a;
b = _b;
/* code */
}
return _a;
}