LintCode_001_A+B问题

问题描述

给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。

说明

a和b都是 32位 整数么?

是的

我可以使用位运算符么?

当然可以

样例

如果 a=1 并且 b=2,返回3

求解

使用位运算符进行加法运算,异或运算得到和(不含进位),与运算再左移得到进位(carry),和与进位“相加”得到结果。“相加”是对前面过程的又一次调用,可以通过递归或循环来实现。

下面以a = 3,b = 5为例来说明这个过程:

第1次循环,a ^ b 为 0011 ^ 0101 得到 0110,a & b 为 0011 & 0101 得到 0001,这说明最后一位相加时需要进位,将 0001 左移得到0010,进入下一个循环;

第2次循环,a ^ b 为 0110 ^ 0010 得到 0100,a & b 为 0110 & 0010 得到 0010,这说明倒数第二位相加时需要进位,将 0010 左移得到0100,进入下一个循环;

第3次循环,a ^ b 为 0100 ^ 0100 得到 0000,a & b 为 0100 & 0100 得到 0100,这说明倒数第三位相加时需要进位,将 0100 左移得到1000,进入下一个循环;

第4次循环,a ^ b 为 0000 ^ 1000 得到 1000,a & b 为 0000 & 1000 得到 0000,这说明没有哪个位需要进位,此时跳出循环,1000即为最终结果。

首次写代码时把判断条件写成了b > 0导致出错,因为漏掉了负数的情况

// Time:  O(logn) = O(32)
// Space: O(1)

class Solution {
public:
    /*
     * @param a: The first integer
     * @param b: The second integer
     * @return: The sum of a and b
     */
    int aplusb(int a, int b) {
        while (b != 0) {
            int sum = a ^ b;
            int carry = (a & b) << 1;
            a = sum;
            b = carry;
        }
        return a;
    }
};

class Solution2 {
public:
    /*
     * @param a: The first integer
     * @param b: The second integer
     * @return: The sum of a and b
     */
    int aplusb(int a, int b) {
        if (b == 0) {
            return a;
        }
        return aplusb(a ^ b, (a & b) << 1);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值