1、题目
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1 输出: 2
提示:
a, b 均可能是负数或 0 结果不会溢出 32 位整数
2、思路
对于计算两个十进制数加法时如13+9
,我们可以先计算不进位下的和,所谓不进位就是不考虑进位对结果造成的影响,
13+9
在不考虑进位时为
1 3 0 9
13+9
不考虑进位后为2
,1+0
进位后为1
,所以就是12
13+9
只考虑进位后为1+0
向前一位进了0
,3+9
向前一位进了1
,然后对结果x10
就是01x10=10
然后再计算12+10
1 2 1 0
12+10
不考虑进位为22
12+10
只考虑进位为00
,00x10=0
然后计算22+0=22
计算机底层计算加法是通过门电路完成,我们计算下二进制下的加法,13=(1101)2 9=(1001)2
1101+1001
不考虑进位为0100
1101+1001
考虑进位为1001
,然后左移既最低位补0
为10010
然后计算00100+10010
00100+10010
不考虑进位为10110
00100+10010
考虑进位为00000
,左移一位为000000
然后计算10110+000000=10110
(10110)2=22
3 实现
// 递归
public int add(int a, int b) {
if (a == 0){
return b;
}else if (b == 0){
return a;
}else{
return add(a^b, (a&b)<<1);
}
}
// 非递归
public int add(int a, int b) {
while(b != 0){
int t = a^b;
b = (a&b)<<1;
a = t;
}
return a;
}