只使用 按位异或 和 按位与 和 左移操作,就能够实现两整数相加,不需要加减系列运算符
具体的原理如下,
首先a + b = (a ^ b) + ((a & b) << 1)
这是因为根据异或的定义,两个二进制数异或的结果实际上就是这两个数按照竖式计算时无进位相加的结果
而(a & b) << 1 就是两个数相加时产生的进位按位放置得到的结果,比如以103104 + 11408为例
0000 0000 0000 0000 0000 0001 0000 0000就是这两个数相加时会在第8位相加的时候因为产生了进位,而在第9位添加一个进位1
那么怎么来计算(103106 ^ 11408)+ ((103106 & 11408) << 1)?
还是使用相同的计算方法绕开 加法
即实现一个循环,直到进位为0时就可以结束循环
cpp
class Solution {
public:
int getSum(int a, int b) {
while (b){
int tmp1 = a ^ b;
b = (a & b) << 1;
a = tmp1;
}
return a;
}
};