package
0.0.0-20230809123828-b071cee2968a
Repository: https://github.com/codehanhan/leetcode-go.git
Documentation: pkg.go.dev
# README
面试题 17.01.不用加号的加法
1. 题目描述
设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a
,b
均可能是负数或 0- 结果不会溢出 32 位整数
标签
位运算
数学
2. 解题
- 分析 可以使用位运算。 两个数字转换成二进制,再相加,则就是这两个二进制数的每一位分别对应相加。 二进制只有0和1, 两个二进制位相加分为4种情况:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10
所以可以得出结论:对于两个数 a,b 若不考虑进位,则相加的结果是
a ^ b
什么情况下会产生进位? 即对应的两个数位都为1的时候,即进行 & 运算, 由于是往"更高的一位"进位,所以需要“左移一格”,即 << 1 ; 所以只进位的部分为
(a & b) << 1
- 递归解法 对于上面的分析,我们可以得出: 两个数 a,b 相加, 即add(a, b), 若相加时没产生进位, 即(a & b) << 1为零,那么 add(a,b) = a ^ b; 如果(a & b) << 1大于零,说明相加时有进位,那么必须把进位给"补上", 即 (a ^ b) + ((a & b) << 1), 那么此刻又转换到了 两个数 (a ^ b) 和 ((a & b) << 1) 相加,即add(a ^ b, (a & b) << 1), 出现了递归关系, 一直递归到两数相加不发生进位时, 递归出口是当 (a & b) << 1 == 0 时, 即 add(int num1, int num2)当第二个入参num2==0时。