CodingInterview-不用加减乘除做加法

不能使用加减法的话就只能使用位运算了。而位运算是针对于二进制的,所以应该从二进制的角度来理解这个事情。

首先 t=num1^num2 是求两个数字的二进制和,但是不算进位,然后使用 num2=(num1&num2)<<1 来计算 num1 和 num2 的进位。接着进入下一轮循环,将进位加到计算的和上。但是,加上进位以后可能还会产生进位,所以就需要不断循环,直到进位(num2)为 0,这时候,返回 num1 即可。

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int Add(int num1, int num2)
{
while(num2!=0){
int t=num1^num2;
num2=(num1&num2)<<1;
num1=t;
}
return num1;
}
};

另外,还发现有人的答案是直接加入汇编代码,这个就很厉害了。

1
2
3
4
5
6
7
8
9
int add(int a, int b)
{
_asm
{
MOV EAX, a
MOV ECX, b
ADD EAX, ECX
}
}