Calculate the sum of two integers a and b, but you are not allowed to use the operator +
and -
.
Example:
Given a = 1 and b = 2, return 3.
分析:不使用“+”“-”等符号来进行加法运算。一般情况下是可以用位运算来解决。
先来看一位二进制加法
1 + 1 = 10
1 + 0 = 01
0 + 1 = 01
0 + 0 = 00
结果的个位和进位分别为两个加数异或和与的关系,即:
个位:
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
进位:
1 & 1 = 1;
1 & 0 = 0;
0 & 1 = 0;
0 & 0 = 0;
进位需要左移来表示。也即:
加数异或 + (加数与 << 1)= 结果。
上述加法继续重复之前的位运算,当进位为0时,异或的结果就为最终的加法结果。
对于两位数的加法,比如
01 + 11 = 100
异或:01 ^ 11 = 10
进位:01 & 11 = 01
异或 + (加数与 << 1)= 10 + 010 = 100
再次异或:10 ^ 10 = 00
进位: 10 & 10 = 10
异或 + (加数与 << 1)= 00 + 100 = 100
再次异或:00 ^ 100 = 100
进位: 00 & 100 = 000
异或 + (加数与 << 1)= 100 + 000 = 100
此时进位为0, 则使用位运算即得到加法运算结果。
代码:
public class Solution {
public int getSum(int a, int b) {
int unit = a ^ b;
int carry_bit = a & b;
while(carry_bit != 0) {
int temp_a = unit;
int temp_b = carry_bit << 1;
unit = temp_a ^ temp_b;
carry_bit = temp_a & temp_b;
}
return unit;
}
}