题. 不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用 +、-、×、÷ 四则运算符号。
数据范围
−1000≤num1,num2≤1000
样例
输入:num1 = 1 , num2 = 2
输出:3
【题解】--- 模拟加法器
不使用加减乘除来进行加法运算,尝试可以模拟计算机的加法器实现。
举个例子:14+8
14的二进制表示:1110
8的二进制表示:1000
我们将整个运算分为 1. 进位 2.不进位
- 第一步进行不进位的运算:
十进制来看:十位为1+0=1,个位为4+8=2 结果为12
二进制来看: 1110+1000=0110 (不进位) 结果为0110
- 第二步进行进位的运算:
十进制来看:只有个位上的4+8进位1得到10 结果为10
二进制来看:1110+1000=10000 (只注意进位) 结果为10000
- 第三步将进位与不进位的结果相加:
十进制结果:12+10=22
二进制结果:10000+0110=10110 ==十进制下的22
- 至此完成了加法运算。
观察上面的计算过程:
二进制不进位的运算结果与 异或 运算结果相同
二进制进位的运算结果与各位 相与& 后左移一位的结果相同
- 因此我们可以通过与运算与异或运算来实现加法运算
1.计算俩个数不算进位的结果(num1^num2)
2.计算两个数算进位的结果 (num1&num2)<<1
3.将两个结果相加.我们发现又要用到加法运算,那么其实我们重复上述步骤就行了,直到一个数变为0(不再进位)运算全部完成
复杂度分析:
奇思妙解复杂度为O(1)。
C++代码实现:
class Solution{
public:
int add(int num1,int num2){
while(num2){
int x=num1^num2;
int y=(num1&num2)<<1;
num1=x;
num2=y;
}
return num1;
}
}