描述
给出两个整数 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;
}