题目描述
思路解析动画文字版
核心三句话:① 异或得到「不考虑进位时每一位的和」;② 与之后左移得到「该往高位进的 1」;③ 把进位不断加回去,没有进位时 a 就是答案。下面逐轮套这条规则。
把 a=23、b=45 写成 7 位二进制(高位在左,不足补 0)。下面两行「无进位和」「进位」待算,整张表 4 行 × 7 列,维度从头到尾不变。
第 1 轮开始。现在 a=23、b=45(紫色两行)。接下来逐位看:每一位上 a、b 的两个比特要做两件事——异或得本位、与得进位。
异或 a^b:每一位「相同得 0、不同得 1」,这正是不考虑进位时该位的和。得到无进位和 = 0111010 = 58(绿色行)。但两个 1 相加该进位的事还没算。
与 a&b:只有「两位都是 1」的位才得 1,那正是要进位的位(0000101)。进位要进到更高一位,所以左移一位 << 1,得进位 = 0001010 = 10(紫色行)。
把无进位和与进位当成新的 a、b:a ← 58、b ← 10。进位还不是 0,说明还有 1 要往上进,回到第 2 轮继续加。
第 2 轮开始。现在 a=58、b=10(紫色两行)。接下来逐位看:每一位上 a、b 的两个比特要做两件事——异或得本位、与得进位。
异或 a^b:每一位「相同得 0、不同得 1」,这正是不考虑进位时该位的和。得到无进位和 = 0110000 = 48(绿色行)。但两个 1 相加该进位的事还没算。
与 a&b:只有「两位都是 1」的位才得 1,那正是要进位的位(0001010)。进位要进到更高一位,所以左移一位 << 1,得进位 = 0010100 = 20(紫色行)。
把无进位和与进位当成新的 a、b:a ← 48、b ← 20。进位还不是 0,说明还有 1 要往上进,回到第 3 轮继续加。
第 3 轮开始。现在 a=48、b=20(紫色两行)。接下来逐位看:每一位上 a、b 的两个比特要做两件事——异或得本位、与得进位。
异或 a^b:每一位「相同得 0、不同得 1」,这正是不考虑进位时该位的和。得到无进位和 = 0100100 = 36(绿色行)。但两个 1 相加该进位的事还没算。
与 a&b:只有「两位都是 1」的位才得 1,那正是要进位的位(0010000)。进位要进到更高一位,所以左移一位 << 1,得进位 = 0100000 = 32(紫色行)。
把无进位和与进位当成新的 a、b:a ← 36、b ← 32。进位还不是 0,说明还有 1 要往上进,回到第 4 轮继续加。
第 4 轮开始。现在 a=36、b=32(紫色两行)。接下来逐位看:每一位上 a、b 的两个比特要做两件事——异或得本位、与得进位。
异或 a^b:每一位「相同得 0、不同得 1」,这正是不考虑进位时该位的和。得到无进位和 = 0000100 = 4(绿色行)。但两个 1 相加该进位的事还没算。
与 a&b:只有「两位都是 1」的位才得 1,那正是要进位的位(0100000)。进位要进到更高一位,所以左移一位 << 1,得进位 = 1000000 = 64(紫色行)。
把无进位和与进位当成新的 a、b:a ← 4、b ← 64。进位还不是 0,说明还有 1 要往上进,回到第 5 轮继续加。
第 5 轮开始。现在 a=4、b=64(紫色两行)。接下来逐位看:每一位上 a、b 的两个比特要做两件事——异或得本位、与得进位。
异或 a^b:每一位「相同得 0、不同得 1」,这正是不考虑进位时该位的和。得到无进位和 = 1000100 = 68(绿色行)。但两个 1 相加该进位的事还没算。
与 a&b:只有「两位都是 1」的位才得 1,那正是要进位的位(0000000)。进位要进到更高一位,所以左移一位 << 1,得进位 = 0000000 = 0(紫色行)。
进位 = 0 了!没有要进的位,循环结束。此时 a = 68 = 1000100 就是最终答案。23 + 45 = 68。
进位归零后 a 就是和:23 + 45 = 68。整个过程只用了异或 ^、与 &、左移 << 三种位运算,一次没用 +。
含 0 与负数的边界先想清。
两个高频追问,把「为什么对、为什么停」讲透。
参考代码
def getSum(a, b): mask = 0xFFFFFFFF while b & mask: a, b = a ^ b, (a & b) << 1 a &= mask # 处理 Python 无限位长的负数补码 return a if a <= 0x7FFFFFFF else ~(a ^ mask)复杂度
- 时间:O(1),32 位整数最多进位 32 轮,与输入大小无关
- 空间:O(1),只用了几个临时变量
易错点
面试追问把动画讲成自己的话
追问为什么异或就是「无进位的加法」?
追问这个循环为什么一定会停?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
整数反转
LeetCode 7 · 中等 · 沿着 位运算 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题