371.给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
示例 1:
输入:a = 1, b = 2
输出:3
示例 2:
输入:a = 2, b = 3
输出:5
提示:
-1000 <= a, b <= 1000
- 位运算肯定是第一想到的了,两数进行异或运算时,我们可以先得到不进位的和,比如 6+5 转为二进制运算为 0110 + 0101=1011,当他们进行异或会得到 0011,只得到了不进位的部分,因为原本应该为 0211,然后满 2 进 1 得到 1011。 而当他们进行与运算,我们就得到了进位的部分 0100,这个 1 是要进位的,即它实际上应该为
0100 << 1 = 1000
,两部分相加其实和不变,即 0110 + 0101 = 0011 + 1000 - 随着每一轮计算一次进位,当所有位的进位的计算完毕,进位的部分最终会为 0,以此作为递归出口即可。
-
public int getSum(int a, int b) {if(b==0)return a;return getSum(a^b, (b&a)<<1);}