剑指 Offer 65-不用加减乘除做加法C++


2021/2/6 二刷
边界判定:当出现进位合为0的时候计算停止。
循环:每一轮使a为当前非进位合,b为当前进位合。由于b会改变,所以必须先存储非进位合的结果。

 while(b) {
            //非进位合
            int res = a ^ b;
            b = (unsigned int)(a & b) << 1;
            a = res;
        }

最终结果:res 即 a


题目描述

在这里插入图片描述

位运算

一、十进制
19 + 8 = 17 + 10
131 + 79 = 900 + 110 = 10 + 1000 = 1010
在草稿纸上写加法运算时,我们会直接把进位移动到前一位 +1,但实际上加法就是经历一个这样的过程
所有的加法都是先计算非进位合再加上进位合的。
在这里插入图片描述
设非进位合为n,进位合为c,则
在这里插入图片描述
然后题目可能出现负数怎么办呢,其实只要计算机补码加减计算是正确的,我们这样就是正确的。
还有LeetCode里面的C++不支持负数左移,所以要变成无符号整数,关于unsigned int到底是怎么样的,负数情况又怎么回事,不是很理解。

class Solution {
public:
    int add(int a, int b) {
        while(b != 0) {
            //此轮非进位合
            int res = a ^ b;
            //此轮进位合
            b = (unsigned int)(a & b) << 1;
            //更新a为此轮非进位合,继续与进位合进行运算
            a = res; 
        }
        return a;
    }
};

在这里插入图片描述
时间复杂度O(1)
空间复杂度O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值