不用加减乘除实现加法
其实看到这玩意,第一反应就是计算机原理东西,就是二进制运算
然后就从二进制角度讨论这玩意吧~
学过小学加法都晓得,加法是从个位加法开始,然后进阶十位加法,解这玩意的思路也可以这样:
先不考虑进位,再考虑有进位。
以2+3为例,转为二进制为10+11
不考虑进位的结果
先枚举下所有情况,再总结规律:
0+1=1
0+0=0
1+0=1
1+1=0(由于不考虑进位,所以就只看最低位的值)
从上面结果看,发现一个规律相同的值结果为0,不同的值结果为1,这就是异或运算符呀~
所以不考虑进位结果用异或计算。
只考虑进位结果
继续枚举所有情况:
1+0=0
0+1=0
1+1=1(这种情况才会产生进位)
0+0=0
从上面结果来看, 发现一个规律两个为1的值结果为1,这明显是与运算符了
所以进位通过与计算。
进入正题
在计算时,先不考虑进位情况做加法运算,得到结果1,然后再只考虑进位情况得到进位情况,得到结果2,结果2左移一位后,再跟结果1做不考虑进位情况加法运算,重复这个行为,直到结果2为0。 伪代码如下:
do
{
计算结果1 = (a^b);
进位值 = (a&b)<<1;
a = 计算结果1;
b = 进位值;
}while(进位的结果!=0)
转化为代码过程
先看看套值过程:
01
^11
————
10(不考虑进位的)
^10(只考虑进位的,并且左移一位)
————
00
^100(只考虑进位,并且左移一位)
————
100
0000(只考虑进位,并且左移一位)
变现为代码:
int add(int a, int b)
{
int nCarry = 0;
do
{
nCarry = ((a&b)<<1);
a^=b;
b = nCarry;
}while(nCarry);
return a;
}