「每日一题」两整数之和

本文介绍了如何利用位运算在不使用加号和减号的情况下计算两个整数的和。通过分析位运算的加法规则,提出通过异或操作得到不进位的和,与操作得到进位,并通过循环处理进位,最终得出正确结果。同时提供了迭代和递归两种实现方式的JavaScript代码示例。
摘要由CSDN通过智能技术生成

这是 LeetCode 上 2021-9-26 的每日一题:「371. 两整数之和」

1. 题目描述

给你两个整数 ab不使用 运算符 +- ,计算并返回两整数之和。

示例:

输入:a = 1, b = 2
输出:3

2. 解答

对于位运算中的加法,只有四种情况:

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0(进位 1

总结规律可得,对于ab,不考虑进位的加法 = a^b

例如,对于a=2b=3

a = 0010
b = 0011

a ^ b:

0 0 1 0
0 0 1 1
-------
0 0 0 1

在位运算中,进位可以有得到:

a = 0010
b = 0011

a & b:

0 0 1 0
0 0 1 1
-------
0 0 1 0

得到的0010并不是真正的进位,进位1需要在更高一位上,故左移一位即可得到0100

那么将不考虑进位的加法加上进位即可得到结果:

0 0 0 1
0 1 0 0
-------
0 1 0 1       (5)

若相加后还有进位的话,将a^b的结果与进位继续进行上述操作,直到没有进位为止。

总结一下,对于给定的ab

  • 不考虑进位的加法:a^b
  • 进位:(a & b) << 1

那么不断地将进位再次与不考虑进位的加法结果作相同的运算,直到进位为0即可。

容易写出以下代码。

1. 迭代

const getSum = (a, b) => {
    while (b) {
        // 进位
        const c = (a & b) << 1;
        // 不考虑进位的加法
        a ^= b;
        // 将进位赋值给b
        b = c;
    }
    return a;
};

2. 递归

也可以用递归实现:

const getSum = (a, b) => {
    if (!b) return a;
    return getSum(a ^ b, (a & b) << 1);
};

简单一点也可以:

const getSum = (a, b) => (b ? getSum(a ^ b, (a & b) << 1) : a);

😄最近新创建了个开源仓库,总结 LeetCode 的每日一题,目前已有 C++、JavaScript 语言版本,欢迎大家提供其他语言版本!

🖥️仓库地址:「每日一题系列」

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值