题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
解题思路
方法一:位运算
1、思路:由如下表格可以发现,在不考虑进位的情况下,两个数的和为这两个数按位异或,而两个数相加之后产生的进位为这两个数按位与再左移一位,当两个数相加之后不产生进位,则这两个数的和正好等于它们按位异或的结果。因为负数在计算机中用补码表示,补码可以统一处理加减法,因此以上方法同时适用于正数和负数的加法。循环求解:
- 计算a和b的无进位和和进位;
- 当进位为0,则a+b的结果就等于无进位和,返回无进位和;
- 当进位不为0,则a+b的结果等于无进位和+进位,令a为无进位和,b为进位,继续循环。
操作数1 | 操作数2 | & | | | ^ |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
a(i) | b(i) | 不考虑进位的和 | 进位 c(i+1) |
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
2、代码:
class Solution {
public:
int Add(int num1, int num2)
{
int tmp;
while (num2) {
tmp = num1;
num1 = num1 ^ num2;
num2 = (tmp & num2) << 1;
}
return num1;
}
};
3、复杂度:
时间复杂度:O(1);
空间复杂度:O(1)。