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

news/2025/3/28 11:00:11/
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)。
  • 判断溢出:通过检查进位是否影响符号位。

关键点

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

http://www.ppmy.cn/news/1583012.html

相关文章

深度解读DeepSeek:开源周(Open Source Week)技术解读

深度解读DeepSeek&#xff1a;开源周&#xff08;Open Source Week&#xff09;技术解读 深度解读DeepSeek&#xff1a;源码解读 DeepSeek-V3 深度解读DeepSeek&#xff1a;技术原理 深度解读DeepSeek&#xff1a;发展历程 文章目录 一、开源内容概览Day1&#xff1a;FlashMLAD…

第十二:josn 传递参数 shouldBindJSON 和结构体的 db字段

链接&#xff1a; Golang教程三&#xff08;结构体、自定义数据类型&#xff0c;接口&#xff09;_golang 自定义数据类型-CSDN博客 结构体指向 json 和数据库的 db type User struct { ID int json:"id" db:"user_id" Name string json:…

Android Compose 框架副作用管理(SideEffect、EffectScope)深入剖析(十八)

Android Compose 框架副作用管理&#xff08;SideEffect、EffectScope&#xff09;深入剖析 一、引言 在现代 Android 开发中&#xff0c;Android Compose 作为一种声明式的 UI 构建方式&#xff0c;为开发者带来了全新的开发体验。它通过简洁的代码和高效的性能&#xff0c;…

mac anaconda3遇到无法创建python2.7版本虚拟环境

在Mac M4电脑上安装了Anaconda3之后,想通过conda创建python2.7的时候遇到错误: conda create -n python27 python=2.7(base) yuxuandong@dongyuxuandeMacBook-Air-2 ~ % conda create -n python27 python=2.7 Channels:- defaults- https://repo.anaconda.com/pkgs/main-

2025前端面试题记录

vue项目目录的执行顺序是怎么样的&#xff1f; 1、package.json   在执行npm run dev时&#xff0c;会在当前目录寻找package.json文件&#xff0c;此文件包含了项目的名称版本、项目依赖等相关信息。 2、webpack.config.js(会被vue-cli脚手架隐藏) 3、vue.config.js   对…

(UI自动化测试web端)第二篇:元素定位的方法_xpath路径定位

看代码里的【driver.find_element_by_xpath( )】( )里的表达式怎么写&#xff1f; 文章介绍了第一种写法&#xff1a;xpath路径定位&#xff08;相对路径、绝对路径&#xff09;。 1、第一种xpath路径定位&#xff0c;分为&#xff1a;相对路径和绝对路径两种写法。 1)绝对路径…

Oracle 外键/引用完整性(Foreign Key / Referential Integrity Constraints)

在数据模型中&#xff0c;当两个表存在"父子"关系时&#xff0c;即可以定义外键约束&#xff0c;这种关系限制一个表中的数据需要参考另一个表中已存在的数据&#xff0c;其中引用的表称为"子表"&#xff0c;被引用的表称为"父表"&#xff0c;引…

高防ip和高防服务器的区别?

高防ip和高防服务器的区别&#xff1f; 高防ip一般是服务商推出的ddos防御增值服务&#xff0c;可以在原有服务器上部署ddos防御服务&#xff1b;高防服务器是具有防御性能的服务器&#xff0c;可抵挡多类攻击。 高防IP没有像服务器那样的桌面控制 远程登录一些操作&#xff0c…