引言
两个整数相加。
例题
算法描述
如果直接加法的话,毫无难度,但是我们可以尝试一种新的做法:不用加号实现相加,即利用二进制的位运算去实现这一目的。
考虑两个数二进制逐位相加,那么不难发现:对于每个bit位,需要考虑三个0/1相加,即第一个数、第二个数、进位。
在二进制中,有如下关系:
第1个数 | 第2个数 | 当前bit位相加结果 | 进位 |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 |
其实,当前bit位的结果就是异或(⊕)操作,而进位就是按位与(&)操作。可以先不考虑进位,把两个加数异或,再把进位的结果集中保存下来(因为是进位,所以按位与之后需要左移1位),当作另一个加数,然后重复这一过程,直到进位为0,得到的即为结果。
代码实现
class Solution {
public:
int sum(int num1, int num2) {
while (num2) {
int tmp = num1 ^ num2;
num2 &= num1;
num2 <<= 1;
num1 = tmp;
}
return num1;
}
};
关键词
力扣 每日一题 两整数相加 2235 位运算