题目:写一个函数,求两个整数之和,要求在函数体内不得使用加减乘除四则运算符号。
思路:
不能使用加减乘除四则运算,能用的也就只剩下位运算了。回顾一下十进制的加法5+17=22,首先是个位相加,5加7得到12,除去进位10,结果为2;然后十位相加0加1得到1,这样可以得到结果为12(不算进位),然后用12加上10(注意这个时候没有产生进位),结果为22。那么这个方法用于二进制数可以吗,5的二进制为101,17的二进制为10001。第一步还是各位相加但不计进位,得到的结果为10100(最后一位有一个进位10),然后第二步记下进位10,然后把前两步的结果相加得到10110,换算成十进制数正好是22。这样利用这个思路,把第一步两个数字二进制相加用异或来计算,第二步将两个数字做位与运算并且向左移一位记录进位,然后第三步把它们加起来,注意第三步相加的时候还是重复前两步的步骤,直到不产生进位为止。
相关问题:不使用新的变量,交换两个变量的值。比如有两个变量a和b,交换它们的值有两种方法
基于加减法 基于异或运算
a=a+b; a=a^b;
b=a-b; b=a^b;
a=a-b; a=a^b
代码:
int Add(int num1, int num2)
{
int sum, carry;
do
{
sum = num1 ^ num2;
carry = (num1&num2) << 1;
num1 = sum;
num2 = carry;
} while (num2 != 0);
return num1;
}