题目链接
思路分析
既然题目禁止使用加减乘除四则运算,那么我们只能考虑使用位运算来进行求解,刚开始如果没有思路,我们可以随便取一些数来找找规律
观察这三组数,可以看到前两组相加都是两个数进行异或的结果,而对于第三组数,经过异或得到0111我们发现,当存在某一位上两个数都为1时,存在进位操作,
所以正确的操作应该是,先计算不进位的情况,然后计算进位的结果,当进位结果不为0时,就将两者相加,重复以上计算。
代码实现
class Solution {
public:
int add(int a, int b) {
//既然不能使用加减乘除,那就考虑使用位运算
//使用异或来表示加法, 使用与运算来表示进位,当进位为0时,运算结束
if(a == 0 || b == 0)
return a == 0 ? b : a;
int sum = 0;
int carry = 0;
while(b)
{
sum = a^b;
carry = (unsigned int)(a & b) << 1;
a = sum;
b = carry;
}
return sum;
}
};