剑指 Offer(第2版)面试题 65:不用加减乘除做加法
剑指 Offer(第2版)面试题 65:不用加减乘除做加法
题目来源:85. 不用加减乘除做加法
解法1:位运算
很容易想到通过位运算来解决问题。
以 5+17=22 为例,参考十进制加法:
- 只做各位相加不进位运算,即得到 12;
- 做进位运算,即得到 10;
- 把前面两个结果先相加,即得到 22。
同样二进制加法也一样:
- 两个整数做异或(^),得到各位相加不进位的运算结果;
2、两个整数做与(&),然后再左移一位,即得到进位的运算结果;
3、将上面两个结果相加,即重复步骤 1、2,直至进位的运算结果为0。
代码:
class Solution
{
public:
int add(int num1, int num2)
{
while (num2 != 0)
{
// 1. 两个整数做异或,得到各位相加不进位的运算结果
int sum = num1 ^ num2;
// 2. 两个整数做与,然后再左移一位,即得到进位的运算结果
int carry = (num1 & num2) << 1;
// 将上面两个结果相加,即重复步骤1、2,直至进位的运算结果为 0
num1 = sum;
num2 = carry;
}
return num1;
}
};
复杂度分析:
时间复杂度:O(logN),其中 N 是 int 类型的位数,N=32。
空间复杂度:O(1)。