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

【算法】位运算算法——两整数之和

题解:两整数之和(位运算算法)

目录

  • 1.题目
  • 2.位运算算法
  • 3.参考代码
  • 4.总结

1.题目

题目链接:LINK
在这里插入图片描述

2.位运算算法

这个题目难点就在于不能用+、-

那什么能够代替加号呢?
既然数的层面不能用+号,那二进制的角度去用+号即可。

恰好,就有两个这种运算符恰好满足我们的需求。
按位异或,对不存在进位的数字进行相加。
按位与,对需要进位的数字取1

当我们对a^b进行异或的时候,
我们发现:
如果1和0不同的位数异或是我们想要的结果,但两个二进制都是1的时候进行异或就不对(红色代表不满足我们预期,绿色代表满足我们预期)
在这里插入图片描述
结论:错误的都是需要进位的二进制

那如何进行进位呢?
怎么确定哪几个二进制位需要进位? ——按位与
按位与恰好可以解决我们这个问题,两个1的二进制位肯定是需要进位的啊(黄色代表需要进位的地方)。
在这里插入图片描述
那如何把这个黄色的位进到a^b上去呢?
我们可以把a&b向左移动一位,表示向其更高位进行进位。
在这里插入图片描述
然后我们再对a^b 和 (a&b)>>1再进行异或运算,看看能不能进上一位。
在这里插入图片描述
我们发现好像有个1进位成功,还一个没能成功,但是没关系,继续以此循环即可。

总过程如下:
在这里插入图片描述

3.参考代码

//一般版本
class Solution {
public:int getSum(int a, int b) {int Carry = 1;while(Carry){int add = a ^ b;Carry = (a & b) << 1;a = add;b = Carry;}return a;        }
};
//语法优化
class Solution {
public:int getSum(int a, int b) {do{a = a ^ b;b = (((a^b) & b) << 1);}while(b);return a;        }
};

4.总结

我们本道题首先题目规定不能用+号,所以我们想到直接去二进制层面进行操作,用^代替无进位相加,用&代替进位,两者结合即可模拟出二进制层面加法的操作。


EOF

相关文章:

  • 手写电纸书天花板,阅读办公新体验 | 汉王手写电纸本 N10 2024 版使用评测
  • 【Python-Pandas】DataFrame选取行数据
  • 5.27作业
  • Linux中 “权限设置修改”
  • 在 MFC 中 UNICODE 加 _T 与 L 长字符串,有什么区别?
  • 样本拟合正弦函数? 梯度下降法? NO,比梯度下降还快的算法.
  • 使用 Django Admin 进行高效的后台管理
  • 【教学类-58-06】黑白三角拼图06(1页3张彩色黑点卡片,一种宫格36张,适合一个班级一次操作)
  • vue3 excel 文件导出
  • 走进全球LED显示龙头艾比森,深挖逆势增长43%的数智化逻辑
  • 操作系统课程实验1-进程调度模拟实验
  • 初识C++ · 模拟实现string
  • 力扣106. 从中序与后序遍历序列构造二叉树
  • 代码随想录算法训练营第五十三天||1143.最长公共子序列、1035.不相交的线、53. 最大子序和
  • 20240523金融读报:跨境支付规模扩大银行服务科创企业举措
  • canvas绘制圆角头像
  • JavaScript 基本功--面试宝典
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • MySQL QA
  • springMvc学习笔记(2)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 分享一份非常强势的Android面试题
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 区块链技术特点之去中心化特性
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 新书推荐|Windows黑客编程技术详解
  • 用mpvue开发微信小程序
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ### RabbitMQ五种工作模式:
  • #《AI中文版》V3 第 1 章 概述
  • #QT(TCP网络编程-服务端)
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (ibm)Java 语言的 XPath API
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (二)linux使用docker容器运行mysql
  • (分布式缓存)Redis哨兵
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (算法)Game
  • (转)母版页和相对路径
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @EnableAsync和@Async开始异步任务支持
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka