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

leetcode371. 两整数之和,位运算

leetcode371. 两整数之和

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

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

示例 2:
输入:a = 2, b = 3
输出:5

提示:
-1000 <= a, b <= 1000

在这里插入图片描述

目录

    • leetcode371. 两整数之和
    • 题目分析
    • 算法思路的深入探讨
      • 异或运算(XOR)
      • 与运算(AND)和左移(<<)
      • 逻辑电路的联系
    • 算法步骤
    • 算法流程
    • 具体代码
    • 算法分析
    • 相似题目

题目分析

实现一个函数,计算两个整数 ab 的和,但不允许使用加法运算符 + 和减法运算符 -。这个问题可以通过位运算来解决,利用异或运算符 ^ 和与运算符 & 来实现加法。

算法思路的深入探讨

这个问题的核心在于如何通过位运算实现加法。这实际上与计算机中的逻辑电路设计紧密相关。在计算机中,加法是通过一系列的位运算来实现的,特别是异或(XOR)和与(AND)运算。

异或运算(XOR)

异或运算有一个很有趣的性质:任何数与自身进行异或运算,结果都是0;任何数与0进行异或运算,结果都是它本身。这使得异或运算非常适合用来计算不带进位的加法部分。

与运算(AND)和左移(<<)

与运算可以用来找出两个数在对应位上的公共部分,即它们的进位。左移运算则可以将这个进位向左移动一位,为下一次加法运算做准备。

逻辑电路的联系

这种位运算的加法方法与逻辑电路中的半加器和全加器的设计非常相似。半加器能够计算两个输入的加法,但不包括进位;全加器则能够计算两个输入的加法,并包括进位。

算法步骤

  1. 初始化一个变量 carry 为0,用于存储进位。
  2. b 不等于0时,进行循环:
    • 计算 ab 的按位与,然后左移一位,得到进位 carry
    • 计算 ab 的异或,得到没有进位的和。
    • 更新 bcarrya 为没有进位的和。
  3. 返回 a 作为最终结果。

算法流程

开始
初始化carry为0
b是否等于0
返回a
计算a&b的按位与然后左移一位得到carry
计算a^b得到没有进位的和
更新a为没有进位的和
更新b为carry

具体代码

class Solution {
public:int getSum(int a, int b) {while(b!=0){unsigned int carry=((unsigned)(a&b))<<1;a=a^b;b=carry;}return a;}
};

算法分析

  • 时间复杂度: O(log(max_int)),其中我们将执行位运算视作原子操作。
  • 空间复杂度: O(1),因为只需要常数级别的额外空间。
  • 易错点: 需要注意整数溢出的问题,特别是在计算进位时,需要将结果转换为无符号整数进行左移。

相似题目

题目链接
371. 两整数之和https://leetcode.cn/problems/sum-of-two-integers/
67. 二进制求和https://leetcode.cn/problems/add-binary/
415. 字符串相加https://leetcode.cn/problems/add-strings/

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Git介绍及配置
  • 一、什么是 mvvm? MVC、MVP、MVVM三种模式的区别与详解
  • [数据集][目标检测]扳手检测数据集VOC+YOLO格式1042张1类别
  • 前同事2024年接私活已入百万,都是用这几个开源的SpringBoot项目
  • 封装了一个iOS评论弹窗
  • 使用js代码模拟React页面中input文本框输入
  • YOLOv8实例分割+双目相机实现物体尺寸测量
  • LSI-9361阵列卡笔记
  • 手机谷歌浏览器怎么用
  • C/C++ 多线程[1]---线程创建+线程释放+实例
  • redis的RDB快照详解
  • C学习(数据结构)-->二叉树
  • SpringBoot依赖之Spring Data Redis 实现地理坐标(Geospatial)
  • 响应式Web设计:纯HTML和CSS的实现技巧-1
  • Java 入门指南:注解(Annotation)
  • bootstrap创建登录注册页面
  • Docker容器管理
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • es6(二):字符串的扩展
  • flask接收请求并推入栈
  • httpie使用详解
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java基本数据类型之Number
  • js中的正则表达式入门
  • MobX
  • Tornado学习笔记(1)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从零搭建Koa2 Server
  • 给初学者:JavaScript 中数组操作注意点
  • 简单易用的leetcode开发测试工具(npm)
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 力扣(LeetCode)21
  • 区块链共识机制优缺点对比都是什么
  • 深度解析利用ES6进行Promise封装总结
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​如何使用QGIS制作三维建筑
  • # Apache SeaTunnel 究竟是什么?
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #微信小程序:微信小程序常见的配置传旨
  • $.ajax,axios,fetch三种ajax请求的区别
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (2022 CVPR) Unbiased Teacher v2
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (规划)24届春招和25届暑假实习路线准备规划
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (七)c52学习之旅-中断
  • (三)c52学习之旅-点亮LED灯
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>