不用加减乘除实现加法

不用加减乘除实现加法

其实看到这玩意,第一反应就是计算机原理东西,就是二进制运算
然后就从二进制角度讨论这玩意吧~
学过小学加法都晓得,加法是从个位加法开始,然后进阶十位加法,解这玩意的思路也可以这样:
先不考虑进位,再考虑有进位。
以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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值