位运算(两整数之和)(3)

https://blog.csdn.net/2601_95366422/article/details/158882226

上节课链接

一.题目

371. 两整数之和 - 力扣(LeetCode)

二.思路讲解

2.1 思路讲解

关于这题,其实给我们普及了一下异或的另一种叫法------无进位相加 。所谓无进位相加,就是只进行按位加但不处理进位,即 1+1=0 不向前进一位。那么,两个数 a 和 b 的异或结果与它们的真实和之间有什么关系呢?只有两种可能:a ^ b != a + b 或 a ^ b == a + b 。前者之所以不相等,就是因为某些位上发生了进位,导致异或结果比真实和少了这些进位的值。因此,我们只需要找出哪些位发生了进位,然后将这些进位补上,就能得到真实和。

那么如何找出进位呢?观察二进制加法,只有两个位都是 1 时才会产生进位,即 1 & 1 = 1 。所以,我们可以用与运算(&) 来检测哪些位需要进位:a & b 的结果中,为 1 的位就是需要进位的位。但是进位是要加到更高一位上的,所以我们需要将 a & b 的结果左移一位,得到真正的进位值。例如,最低位都是 1,进位就要加到第二位。

然而,进位本身可能又会引发新的进位,就像计算 999 + 1 ,最低位进位后,中间位又会产生进位,一直传递下去。因此,这个过程需要循环进行 ,直到不再产生进位为止。循环的条件就是当前进位不为 0。具体步骤是:

  1. 先计算 无进位和 :x = a ^ b。

  2. 再计算 进位 :y = (a & b) << 1。

  3. 然后,将 x 作为新的 a,y 作为新的 b,重复上述过程,直到 y 为 0。

    最终,x 就是两数之和。

三.代码演示

cpp 复制代码
class Solution {
public:
    int getSum(int a, int b) 
    {
        int sum1 = 0;
        int sum2 = 0;
        while(b)
        {
            sum1 = a ^ b;
            sum2 = (a & b) << 1;
            a = sum1;
            b = sum2;
        }
        return a ^ b;
    }
};

四.代码讲解

一、初始化变量

我们定义两个变量 sum1 和 sum2,用于在循环中暂存中间结果。其中 sum1 用于存储无进位相加的结果 ,sum2 用于存储进位值 。初始时,a 和 b 分别为输入的两个整数。

二、循环处理进位

使用 while(b) 循环,条件是 b 不为 0。这是因为 b 代表当前的进位值,只要还有进位,就需要继续计算。在循环内部,执行以下三步:

  1. 计算无进位和 :sum1 = a ^ b 异或运算模拟了二进制加法中不考虑进位的部分。对于每一位,0+0=0,0+1=1,1+0=1,1+1=0(因为进位被分离出去),这正是异或的特性。

  2. 计算进位值 :sum2 = (a & b) << 1 与运算 a & b 得到哪些位同时为 1,这些位需要产生进位。然后将结果左移一位,因为进位要加到更高一位上。例如,最低位都是 1,进位应该加到第二位,所以左移一位。

  3. 更新 a 和 b :将 sum1 赋给 a,sum2 赋给 b。 这样,下一轮循环中,a 代表当前的无进位和,b 代表新的进位。如果还有进位,则继续循环;否则 b 变为 0,循环结束。

三、循环结束后的处理

当 b 为 0 时,表示已经没有进位,此时 a 中存储的就是最终的和。

四、关键细节
  • 异或与进位的分离:通过异或和与运算,将加法拆解为无进位和与进位两部分,这是位运算模拟加法的核心思想。

  • 循环的必要性:进位可能产生连锁反应(如 999+1),需要循环处理直到进位为 0。

  • 终止条件 :当 b 为 0 时,说明没有进位,此时 a 即为结果。

相关推荐
C++ 老炮儿的技术栈4 分钟前
机器人的坐标,像 XYZ 的坐标值,是用单精度浮点还是用双精度浮点?
c语言·c++·人工智能·单片机·c
zaizai10076 分钟前
STL深度剖析2
java·c++·算法
幻智星科技13 分钟前
FPGA纯硬件UDP桥接:微秒级响应新范式
c++·fpga开发·硬件架构
数智奔流18 分钟前
MiniMax的低价攻势,撞上“背题”疑云
前端·javascript·算法
青少儿编程课堂19 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:位运算实战——二进制权限与最大异或解析
c++·python·算法·bfs·信息学竞赛
广州智造21 分钟前
Radioss中破坏模型FAILTAB1的详细介绍
数据库·人工智能·算法·机器学习·仿真软件·radioss
青少儿编程课堂21 分钟前
2026蓝桥杯青少组图形化真题:校园飞机大战解析(全国青少年信息素养·电子学会图形化考级)
c++·python·算法·bfs·信息学竞赛
开开心心就好27 分钟前
证件照排版打印工具,免费可自定义尺寸
服务器·开发语言·算法·随机森林·pdf·音视频·散列表
lisw0529 分钟前
导数与机器学习优化!
算法·机器学习·数学建模
CodeYp201934 分钟前
第16讲:set 和 map 的使用
开发语言·c++·set·map