写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
想法:
使用位运算去模拟,那么下一步就是怎么模拟。
- 二进制的按位相加实际等效于异或。 (异或,相同为0,相异为1;1与1异或为0,相当于产生了进位,但实际上对整个数进行异或时不会有进位的效果,00和10的情况就完全相当于加法的操作)
- 二进制的每位的进位计算等效于按位与,然后左移。(按位与,相当于把上一步1异或1的位置给标记了出来,之后左移一下再异或,因为异或不能得到进位后的结果,所以,还要再次检查是否,进位后的结果是否会导致再次进位,因此要迭代到这一步要进位的数为0,不会再产生进位)
进位,按位相加,这两个模块的相互配合就是最终结果。
实现
#include <iostream>
using namespace std;
int add(int a,int b)
{
int model1 = 0, model2 = 0;
do{
model1 = a^b;
model2 = (a&b) << 1;
a = model1; //迭代
b = model2;
} while (b != 0);
return model1;
}
int main()
{
int a,b;
cin >> a >> b;
cout << add(a, b);
return 0;
}