题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用 +、-、×、÷ 四则运算符号。
样例
输入:num1 = 1 , num2 = 2
输出:3
算法
(模拟加法器) O(1)
不使用加减乘除来进行加法运算,我们可以模拟计算机的加法器实现。
举个例子: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) 的结果相同
因此我们可以通过与运算、异或运算、左移运算来实现加法运算。
1.计算俩个数不算进位的结果(num1^num2)
2.计算两个数只算进位的结果(num1&num2)<<1
3.将两个结果相加,我们发现又要用到加法运算,那么其实我们重复上述步骤就行了,直到一个数变为0(不再进位),运算全部完成。
举例
C++代码
#include<iostream>
using namespace std;
int Add(int num1, int num2)
{
int num = num1, carry;
while(num2)
{
num = num1 ^ num2; //不进位
carry = (num1 & num2) << 1; //进位
num1 = num;
num2 = carry;
}
return num;
}
int main()
{
int a, b;
cin>>a>>b;
cout<<a<<"+"<<b<<"="<<Add(a, b)<<endl;
return 0;
}