不用+号算加法(位运算实现)


最近在LeetCode上刷题看到一道非常有意思的题,如何不用+号算加法?我觉得挺有意思的故而分享给大家。


在不能使用 + 号的情况下其实很容易想到运用位运算去解决问题,也就是用二进制去表示十进制加法的逻辑。所以我们可以先拆分十进制加法来帮助理解。

十进制相加思想:例如 15+07 , 先计算不考虑进位的相加结果 12 (因为 5+7 的不考虑进位的结果是 2 ,遇 10 进位),然后计算进位 5+7 进位是 10 ,则 10 与 12 再次相加,得到 22 ,进位为 0 ,则计算到此结束。

到此我们就知道了其实二进制加法也可以像这样分开计算求进位不考虑进位的和当进位为0时结束计算。

具体计算过程如下(例十进制:5 +7):

num1num2进位不考虑进位的相加结果
01010111(0101&0111)<<1得到:1010(0101^0111)得到:0010
进位数与不进位数继续相加10100010(1010&0010)<<1得到:0100(1010^0010)得到:1000
进位为0结束01001000(0100&1000)<<1得到:0000(0100^1000)得到:1100

二进制最后计算结果1100(十进制12)

代码如下:

int Add(int num1, int num2 ) {
    while(num2 != 0) {//进位不为0则持续与相加结果进行相加
        int tmp = num1 ^ num2;//得到每位相加不考虑进位的数据
        num2 = (num1 & num2) << 1;//同1的位相加则会进位
        num1 = tmp;
    } 
    return num1;
}

最后感谢大家观看~

 

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言扫地僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值