给你两个整数 a
和 b
,不使用 运算符 +
和 -
,计算并返回两整数之和。
示例 1:
输入:a = 1, b = 2
输出:3
示例 2:
输入:a = 2, b = 3
输出:5
提示:
- -1000 <= a, b <= 1000
分析:
本题要求不使用加减号来完成加法运算,按计算机思维来考虑的话不难想到可以通过位运算来模拟计算机的加法。本题需要用到三个位运算符&与运算
、^异或运算
、<<移位运算
。其中异或运算可实现不进位的加法运算。与运算可以知道该位是否需要进位,由于进位值将加到更高位,因此需要进行左移位。
这时a + b
的运算就变成了(a&b)<<1 与 a^b的加法运算
由于左移位最终会变成0,这时也就能直接得出答案了。
class Solution {
public:
// a+b = (a&b << 1) + a^b
int getSum(int a, int b) {
if(0 == a)
return b;
//这里重点是需要进行类型转换
return getSum((unsigned int)(a&b) << 1,a^b);
}
};
此外,本题还有一个特别好玩的解法,我们知道对数函数能够将乘除法运算变为加减法运算。同理我们也能把加减法运算用乘除法的形式来表示。
class Solution {
public:
int getSum(int a, int b) {
if(a == 0)
return b;
if(b == 0)
return a;
return log(exp(a)*exp(b));
}
};