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