题目如下:
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.
不让用加号或者减号,自然想到了一些逻辑操作,与或非,异或等等。一位数相加无非是四种可能
a | b | a+b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
可以看出这就是异或的结果,但是还要考虑进位的问题,进位的真值表如下
a | b | carry(a+b) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
进位则是逻辑与的关系。则算法如下:
public class Solution {
public int getSum(int a, int b) {
if(a == 0) return b;
if(b == 0) return a;
while(b != 0) {
int carry = a & b;
a = a ^ b;
b = carry << 1;
}
return a;
}
}
以上算法也可用递归实现
public class Solution {
public int getSum(int a, int b) {
return (b == 0) ? a : getSum(a ^ b, (a & b) << 1);
}
}