a + b = (a ^ b) ^ ((a & b)) << 1;循环至进位数为0为止。
a | b | n(无进位和) | c(进位) |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
参考了大佬的题解:
面试题65. 不用加减乘除做加法(位运算,清晰图解)
1.java提交可以过
class Solution {
public int add(int a, int b) {
while(b!=0){
int c=(a & b)<<1;
a ^= b;
b = c;
}
return a;
}
}
2.c++按以上代码提交过不了,因为有负数时左移会溢出,故要加 unsigned int强制类型转换
参考了力扣c++题解别人的处理方法。
class Solution {
public:
int add(int a, int b) {
while(b){
int c = a & b;
c = (unsigned int)c<<1; //有负数时不强转会溢出,故需要转换为无符号整数
a ^= b;
b = c;
}
return a;
}
};
3.c++递归版本,原理差不多
参考了力扣评论区
class Solution {
public:
int add(int a, int b) {
return b==0?a:add(a^b,(unsigned int)(a&b)<<1);
}
};