这么简单的题竟然能卡我一个晚上,果然之前机组课上划过的水,总有一天会还的。
首先 要明确的是 a+b=a^b+(a&b)<<1
但是这里仍然使用了+号,所以要通过循环迭代的方式,来替换掉这个加号
a^b
是不进位加法
(a&b)<<1
得到进位
一开始我有一个点一直想不明白进位加(异或)一次就行了,怎么能一直加(异或)。。
实际上还是没逃脱十进制的思维固化
因为二进制的特殊性,异或的结果和进位的结果不进位相加后,会产生新的进位,你需要一直加这个新的进位,直到把它加完(也就是最后num2为0的情况),才能得到最后的答案
而上述中的加法是通过循环和异或配合实现的,新的进位通过&运算得到
class Solution {
public:
int add(int num1, int num2){
while(num2)
{
int a=num1^num2;
int b=(num1&num2)<<1;
num1=a;
num2=b;
}
return num1;
}
};