A + B 问题

博客围绕求两个整数 a 和 b 的和展开。给出样例,提出挑战,即不使用算数运算符求和。说明可使用位运算符,还给出注意事项。介绍了方法一,利用异或运算模拟加法过程,最终公式为 a + b = (a ^ b) + (a & b << 1),但不允许用 + 号,需考虑进位,终止条件是进位为 0。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出两个整数 aa 和 bb , 求他们的和。

样例

样例 1:

输入:  a = 1, b = 2
输出: 3	
样例解释: 返回a+b的结果.

样例 2:

输入:  a = -1, b = 1
输出: 0	
样例解释: 返回a+b的结果.

挑战

显然你可以直接 return a + b,但是你是否可以挑战一下不这样做?(不使用++等算数运算符)

说明

a和b都是 32位 整数么?

  • 是的

我可以使用位运算符么?

  • 当然可以

注意事项

你不需要从输入流读入数据,只需要根据aplusb的两个参数a和b,计算他们的和并返回就行。

 

方法一:

class Solution {
public:
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: The sum of a and b 
     */
    int aplusb(int a, int b) {
        // write your code here
         return a + b;
    }
};

思路:

// 主要利用异或运算来完成

// 异或运算有一个别名叫做:不进位加法

// 那么a ^ b就是a和b相加之后,该进位的地方不进位的结果

// 然后下面考虑哪些地方要进位,自然是a和b里都是1的地方

// a & b就是a和b里都是1的那些位置,a & b << 1 就是进位之后的结果。所以:a + b = (a ^ b) + (a & b << 1)

// 令a' = a ^ b, b' = (a & b) << 1

// 可以知道,这个过程是在模拟加法的运算过程,进位不可能

// 一直持续,所以b最终会变为0。因此重复做上述操作就可以

// 求得a + b的值。

最终的公式其实就是a + b = (a ^ b) + (a & b << 1),但是不允许使用 + 号,所以需要考虑每一个进位,最终的终止条件就是进位为0

方法二:

class Solution {
public:
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: The sum of a and b 
     */
    int aplusb(int a, int b) {
        // write your code here
         while (b != 0) 
         {
            int _a = a ^ b;
            int _b = (a & b) << 1;
            a = _a;
            b = _b;
        }
        return a;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值