当前位置: 首页 > news >正文

5.3 位运算专题:LeetCode 371. 两整数之和

1. 题目链接

LeetCode 371. 两整数之和


2. 题目描述

不使用运算符 +-,计算两个整数 ab 的和。
示例

  • 输入:a = 1, b = 2 → 输出:3
  • 输入:a = -1, b = 1 → 输出:0

3. 示例分析
  1. 正数相加
    • a = 3, b = 5 → 二进制 0011 + 0101 → 结果 1000(十进制 8)。
  2. 负数与正数相加
    • a = -1(二进制补码全 1),b = 1 → 结果 0
  3. 进位传递
    • a = 151111),b = 1 → 结果 1610000)。

4. 算法思路

核心思想位运算模拟加法器

  1. 无进位相加
    • 使用异或运算 a ^ b 得到无进位相加的结果。
    • 异或的特性:0+0=0, 1+1=0(无进位),1+0=1
  2. 计算进位
    • 使用与运算 a & b 找到需要进位的位,左移一位得到进位值。
  3. 循环处理进位
    • 将进位值与无进位和重复上述操作,直到进位为 0

数学原理

  • 加法可分为两部分:无进位和 x = a ^ b 和进位 carry = (a & b) << 1
  • 最终结果为 x + carry,但需要通过循环将进位合并到结果中。

5. 边界条件与注意事项
  1. 负数处理
    • 使用 unsigned int 转换进位,避免有符号数左移的未定义行为。
  2. 循环终止条件
    • 当进位 carry0 时,结束循环。
  3. 符号位兼容性
    • 补码表示下,该算法天然支持负数运算。

6. 代码实现
class Solution 
{
public:
    int getSum(int a, int b) 
    {
        while (b) 
        {
            int x = a ^ b;         // 无进位相加
            unsigned int carry = (unsigned int)(a & b) << 1; // 计算进位
            a = x;
            b = carry;
        }
        return a;
    }
};

在这里插入图片描述


与暴力枚举法的对比

方法时间复杂度空间复杂度核心思想
位运算法O(1)O(1)模拟硬件加法器,逐位处理进位
暴力枚举法O(n)O(1)通过循环增/减 1 逐次逼近结果

位运算法的优势
  1. 时间复杂度最优:最多循环 32 次(32 位整数),时间复杂度为常数。
  2. 无额外空间:仅需临时变量存储中间结果。
  3. 支持负数运算:利用补码特性,天然兼容负数。

分步解析

  1. 初始状态
    • a = 30011),b = 50101)。
  2. 第一次迭代
    • x = 3 ^ 5 = 60110)。
    • carry = (3 & 5) << 1 = 1 << 1 = 20010)。
  3. 第二次迭代
    • x = 6 ^ 2 = 40100)。
    • carry = (6 & 2) << 1 = 2 << 1 = 40100)。
  4. 第三次迭代
    • x = 4 ^ 4 = 0
    • carry = (4 & 4) << 1 = 4 << 1 = 81000)。
  5. 第四次迭代
    • x = 0 ^ 8 = 8
    • carry = (0 & 8) << 1 = 0
  6. 终止循环:返回 a = 8

总结

位运算法的核心在于通过异或和与运算,逐层处理进位,最终合并结果。相较于暴力法(若允许使用 ++ 运算符),其时间复杂度从 O(n) 优化至 O(1),尤其适合大整数运算。该算法不仅是计算机底层加法器的实现原理,也是解决“禁止使用运算符”类问题的经典范式。

应用扩展

  • 实现减法:a - b = a + (-b),需先计算 -b 的补码(~b + 1)。
  • 判断溢出:通过检查进位是否影响符号位。

关键点

  • 理解补码和位运算的底层逻辑。
  • 循环终止条件与进位的正确处理。

相关文章:

  • 区块链驱动金融第十章——走进另类币与加密货币生态系统:比特币之外的广阔天地
  • 知识库外挂 vs 大脑全开:RAG与纯生成式模型(如GPT)的终极Battle
  • vue判断组件是否有传入的slot,有就渲染slot,没有就渲染内部节点默认内容
  • MATLAB—从入门到精通的第四天:函数、绘图与数学魔法
  • 【Python机器学习】3.5. 决策树实战:基于Iris数据集
  • 使用LLama-Factory的简易教程(Llama3微调案例+详细步骤)
  • 【RabbitMQ高级特性】消息确认机制、持久化、发送方确认、TTL和死信队列
  • 腾讯云大模型知识引擎×DeepSeek | 企业应用快速接入手册
  • 【Redis实战专题】「技术提升系列」​RedisJSON核心机制与实战应用解析(入门基础篇)
  • Spring MVC配置
  • Jackson使用ArrayNode对象实现JSON列表数据(二):增、删、改、查
  • Redis 发布订阅
  • GZCTF平台搭建及题目上传
  • 基于简单神经网络的线性回归
  • 【Vue3入门1】01-Vue3的基础 + ref reactive
  • 什么是 DAO?
  • 深入解析libsunrpc:构建分布式系统的核心RPC库
  • [Windows] AI智能音频分离软件SpleeterGui v2.9.5.0【官方中文版】
  • 基于BERT的序列到序列(Seq2Seq)模型,生成文本摘要或标题
  • vue3,element-plus 表格搜索过滤数据
  • 一场与纪录并行的伦敦马拉松,超40项新世界纪录诞生
  • 今年我国电影票房破250亿领跑全球,“电影+”带动文旅消费热潮
  • 亮剑浦江丨上海网信部门处罚一批医疗服务类互联网企业,三大类问题值得关注
  • 北美票房|《罪人》遭媒体唱衰,好莱坞业内人士集体反击
  • 国家发展改革委:我们对实现今年经济社会发展目标任务充满信心
  • 广东一公司违规开展学科培训被罚没470万,已注销营业执照