Calculate the sum of two integers a and b, but you are not allowed to use the operator +
and -
.
Example 1:
Input: a = 1, b = 2 Output: 3
Example 2:
Input: a = -2, b = 3 Output: 1
实现加法操作
首先,两个数的加法(无论是正数还是负数),都是按照二进制加法完成的。
所以我们需要模拟出这个二进制加法过程。
首先,不考虑进位时,a,b相加就是 a^b(按位异或)
进位是多少呢?只有a,b对应的位都是1时,进位为1,其他情况都是0,所以进位是a&b(按位与)
再想一下,进位是要加到它左边的位上去的,所以应为(a&b)<<1
此时,将 a&b 和 (a&b)<<1 相加就是结果
那么,这个时候,这两个数怎么相加呢?很简单,继续重复上面的做法!
直到进位为0,另一个数就是结果了。
---------------------------------
如何证明这个过程会终止?
注意:b每次都会左移,从而增加一个0位。而a_reserve&b也不可能增加b中的0位个数。由于int是32位,因此最多32次左移之后,b就成了0
即循环一定会终止。
class Solution {
public int getSum(int a, int b) {
while(b!=0){
int a_reserve = a;
a = a^b;//无进位相加
b = (a_reserve&b)<<1; //进位
}
return a;
}
}