写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
首先想到使用位运算去模拟,那么下一步就是怎么模拟。
二进制的按位相加实际等效于异或。
二进制的每位的进位计算等效于按位与,然后左移。
进位加上按位相加结果就是最终结果。
注意,上一步还可能会有进位,不过没关系,还可以重复使用前两步,直到没有进位为止。
int Add(int num1, int num2)
{
int sum = 0;
int carry = 0;
do
{
sum = num1^num2;
carry = (num1 & num2)<<1;
num1 = sum;
num2 = carry;
}
while(num2!=0);
return num1;
}
另外再记录两种不使用临时变量,甚至不使用四则运算交换数字的方案
int swapv1(int &num1,int &num2)
{
num1 = num1+num2;
num2 = num1-num2;
num1 = num1-num2;
}
int swapv2(int &num1, int &num2)
{
num1 = num1^num2;
num2 = num1^num2;
num1 = num1^num2;
}