设计一个函数把两个数字相加。不得使用 + 号算术运算符。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数
方法一
真的没用到加号(手动滑稽)
int add(int a, int b) {
return a-(-b);
}
方法二(正经的解题思路)
其实就是用位运算实现加法:
普通加法中:例如 13 + 8
如果我们先将对应位子的数字相加,不考虑进位的话,应该是
3 + 8 = 1 进位为1
1 + 0 = 1 进位为0
之后我们将个位的进位1 与十位上的1相加
1 + 1 = 2 进位为0
如果我们将此方法带入到二进制的运算中是否可行呢?
13 => 1101
8 => 1000
首先我们不考虑进位将两个二进制相加 1101 + 1000 = 0101 这个操作与(1101 异或 1000)的出来的值相同
从上一步中我们可以得出,进位为1,且在第3位(从右往左数)进1位 => 1000 << 1 = 10000
之后将 10000 + 0101 = 10101 => 21 此时进位位0,即可退出。
Java代码如下:
public int add(int a, int b) {
while (b != 0) {
int sum = a ^ b;
int carry = (a & b) << 1;
a = sum;
b = carry;
}
return a;
}