Leetcode - Bit minipulation - 371. Sum of Two Integers(递归模拟位运算求和)

1. Problem Description

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

 

Example:

Given a = 1 and b = 2, return 3.

 

什么?你说好简单?输出两个数的和?

 

2. My solution1(O[n])

class Solution {
public:
    int getSum(int a, int b) {
        return a+b;
    }
};

3. My solution2(位运算O[n])

模拟计算机内部运算加减法的过程 : 1222为例

12的二进制表示: 1100

22的二进制表示:10110

①第一层:

首先用异或和,求得不含进位和:

1100^10110=11010

然后两数与,求得两者进位

1100&10110=00100

左移一位,表示进位到下一位。

- >01000

现在我们就得到了这一步的“不含进位和”与“进位数”,再递归传到下一层继续往复计算。

num=11010,carrynext=01000.

②第二层

首先用异或和,求得不含进位和:

11010^01000=10010

然后两数与,求得两者进位

11010&01000=01000

左移一位,表示进位到下一位。

- >10000

现在我们就得到了这一步的“不含进位和”与“进位数”,再递归传到下一层继续往复计算。num=10010,carrynext=10000.

③第三层

10010^10000=00010

10010&10000=10000

- >100000

num=00010,carrynext=100000.

④第四层

00010^100000=100010

00010&100000=000000

- >0000000

num=100010,carrynext=0000000.

至此,carrynext也就是进位为0,我们返回最终结果100010也就是34

class Solution
{
public:
    int getSum(int num, int carry)
    {
        if(carry==0)
            return num;
        int sum=num^carry;//两数和
        int carrynext=(num&carry)<<1;//模拟进位
        return getSum(sum,carrynext);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值