不使用加减乘除计算两个数的和

国际惯例,先上代码:

1
2
3
4
5
6
public int Add(int num1,int num2){
int tmp = num1;
num1 = tmp^num2;
num2 = tmp&num2;
return num2 == 0?num1:Add(num1,num2 << 1);
}
JAVA

分析:
1.两数字a、b相加,其实是二进制的相加
2.两个数字异或运算,结果为c,
3.两个数字与运算,若等于0,则表示没有进位,返回c即可
否则,存在进位,结果为d
4.将d左移1位,与c进行相加,重复1-4即可。

举例:3(011)和5(101)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3^5=011^101=110
3&5=011^101=001
因为001不等于0,表示有进位,左移1位,为010
将110和010相加
110^010=100
110&010=010
因为010不等于0,表示有进位,左移1位,为100
将100和100相加
100^100=000
100&100=100
因为100不等于0,表示有进位,左移1位,为1000
将1000和000相加
1000^0000=1000
1000&0000=0000
0000等于0,没有进位,返回1000(8)即可

结论:3+5=8
ROUTEROS

注:减法类似


不使用加减乘除计算两个数的和
https://leehoward.cn/2021/03/24/不使用加减乘除计算两个数的和/
作者
lihao
发布于
2021年3月24日
许可协议