题目描述
思路解析动画文字版
十进制手算进位不适合机器位运算。
a xor b 得到无进位和,(a & b) 左移得到进位;重复直到进位为 0。
1. 不用 + 号做加法:不准用 + 号。上行 a=2=0010,下行 b=3=0011。两个核心位运算:a^b = 不进位的和、(a&b)<<1 = 进位。
2. 异或求和 · 与左移求进位:a^b = 0010^0011 = 0001(各位相加、忽略进位)。a&b = 0010(都是 1 的位),左移一位 = 0100(进位落到高一位)。
3. a←不进位和, b←进位, 重复:把 a 换成不进位和 0001、b 换成进位 0100,再来一次。
4. 再算一轮 · 进位变 0:a^b = 0001^0100 = 0101(=5);a&b = 0,左移还是 0 → 没有进位了。
5. 关键帧 · 进位归零即答案:关键帧:加法 = 不进位和(^) + 进位(&<<1),把进位反复并入,直到 进位 b = 0 就停。答案 = a = 0101 = 5。这正是硬件加法器的原理。
一句话记住:a xor b 得到无进位和,(a & b) 左移得到进位;重复直到进位为 0。
边界三连:三种边界先想清楚。
面试追问 1:核心思路。
面试追问 2:停止条件与复杂度。
面试追问 3:Python 掩码处理负数。
这题学完不要乱跳,下一步去对应专题 /leetcode-animation/ds?k=bit 连刷同类题;卡住时用 AI 答疑问“我的状态定义哪里不稳”。
参考代码
class Solution: def getSum(self, a, b): mask = 0xffffffff while b & mask: carry = (a & b) << 1 a = (a ^ b) & mask b = carry & mask return a if a <= 0x7fffffff else ~(a ^ mask)复杂度
- 时间复杂度:O(1),位宽固定,进位最多传播 32 次
- 空间复杂度:O(1),只用 a、b、carry 几个变量
可套用的代码模板
骨架:a^b 求和、(a&b)<<1 求进位,进位并入直到为 0。
Python
# 不用 + 做加法while b != 0: carry = (a & b) << 1 # 进位 a = a ^ b # 不进位和 b = carry # 进位并入,再来一轮return a易错点
面试追问把动画讲成自己的话
追问核心思路是什么?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
整数反转
LeetCode 7 · 中等 · 沿着 位运算 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题