371. 两整数之和(中等)

Blind 75 › 371. 两整数之和(中等) (第 5 章)
文章工具

题目

给你两个整数 a 和 b,要求不使用 + 和 - 两个运算符,返回它们的和。

换句话说:不能直接写 a + b,只能靠位运算把“加法”重新造出来。

自造示例:a = 7, b = 5 → 12;a = -3, b = 2 → -1。

约束:-1000 ≤ a ≤ 1000、-1000 ≤ b ≤ 1000;结果也在 32 位有符号整数范围内。

思路

一句话:把加法拆成“不带进位的和”与“进位”两部分——前者用异或、后者用与运算再左移,反复合并到进位消失。

先说最直白的:既然数值范围不大,能不能一次挪 1?比如 b > 0 时就反复“a 增 1、b 减 1”,直到 b 变成 0。思路确实直接,但“增 1 / 减 1”本身就要用 + 或 -,等于把一次加法拆成很多次更慢的加法;一旦数变大,代价会爆炸。

于是回到二进制。竖式加法从右往左看,每一位只做两件事:算本位结果、算有没有进位。四种情况正好是一张表:

a 位b 位本位结果是否产生进位
000否
011否
101否
110是

关键观察:这张表里“本位结果”恰好是 a ^ b(异或:相异为 1),“是否进位”恰好是 a & b(与:都为 1 才为 1)。进位要作用到下一位,所以真正的进位是 (a & b) << 1。

因此两数之和 = (a ^ b) + ((a & b) << 1)。右边虽然还藏着一个 +,但我们可以把这两个部分重新当成“新的两数相加”继续套同一招;每轮进位都会往左移,最终一定会变成 0。进位为 0 时,a 就是答案。

解法

用一个循环:只要进位 b != 0,就把“无进位和”与“进位”当作新的 a、b 再合并。以 a = 7、b = 5 为例:

轮

🔒

本篇为付费内容

您已阅读试读部分,购买后即可解锁全文。

⚠️ 本站内容已做唯一性标记并受版权保护,未经授权禁止转载,侵权必究。

还没有评论,来说两句?

发表评论

欢迎交流技术细节;广告与人身攻击会被删除。

在线咨询