题目要求
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数
思路
- 限制了不能使用加减乘除运算符,所以考虑使用位运算解决
- a+b得到两个结果,分别为非进位和(不带进位的和)与进位,非进位和+进位=最终结果
- 由于非进位和+进位仍然可能得到进位,因此需要循环操作,直到进位为0
- 为了处理负数,需要将左移操作强制类型转换为unsigned int类型
- 非进位和用a^b表示,进位用(unsigned int)(a&b)<<1表示
代码
class Solution {
public:
int add(int a, int b) {
while(b)
{
int he=a^b;//非进位和
int jin=(unsigned int )(a&b)<<1;
a=he;
b=jin;
}
return a;
}
};
另外一种递归思路解法
class Solution {
public:
int add(int a, int b) {
// 后续用a表示非进位和,b表示进位,当进位为0,则表示计算结束
return b == 0 ? a : add(a^b, (unsigned int)(a&b) << 1);
}
};