LeetCode371.两整数之和(C++实现)

题目描述

解题思路

这道题是需要用两数相与和异或来实现的,刚开始搞不清楚实现的过程,最后弄明白了,特总结说明如下:

首先:a与b两个整数相异或(^)求得的是a与b无进位的相加,比如

这里的无进位相加指的是每一个对应的二进制位相加的时候都没有进位! 那么我们就有了一个主意->

如果我们将这个无进位相加的结果跟他们本来产生的进位再相加,那不就是a与b最终的和嘛!!!

问题是:a与b相加产生的进位哪里来呢? 

巧合的是:a & b 刚好就是相加产生的进位,如下所示:

        

a与b相与,产生的进位结果是 101,分别是a与b相加时,三个对应二进制位相加的进位结果!!

那么,我们如何用 ^ 和 & 实现a与b的加法呢? 我们只需要将 a & b相与的结果即101向左左移一位变成1010,再与a ^ b即010相加,就是a与b相加的最终结果! 看看是不是呢?? 1010 + 010 = 1100 = 12  = 7 + 5 

但是问题是我们求出来的a ^ b 和 a & b 的结果并不能使用 + 运算啊 ! 怎么办?

好办!! 继续使用 ^ 和 & 做下去不就行了??

什么时候是个头呢? 设想->> 当两个数相加的进位为零的时候,不就结束了么??

所以,有此思路,代码也就水到渠成了=========

class Solution {
public:
    int getSum(int a, int b) {
        int sumNoCarry = a ^ b; //求a与b无进位的和
        int carry = a & b; //求a与b的进位
        if(carry != 0)  //当进位为零的时候就结束了
            return getSum(sumNoCarry, carry << 1); //进位不为零,就要将刚计算的两个结果继续使用此方法递归,注意进位结果要左移
        return sumNoCarry;
    }
};

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值