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 位 | 本位结果 | 是否产生进位 |
|---|---|---|---|
| 0 | 0 | 0 | 否 |
| 0 | 1 | 1 | 否 |
| 1 | 0 | 1 | 否 |
| 1 | 1 | 0 | 是 |
关键观察:这张表里“本位结果”恰好是 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 为例:
轮本篇为付费内容您已阅读试读部分,购买后即可解锁全文。 ⚠️ 本站内容已做唯一性标记并受版权保护,未经授权禁止转载,侵权必究。 |
|---|
还没有评论,来说两句?