题目描述:
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”,“-”,“*”,“/”四则运算符号。
解题思路:
三步走:
1. 将两个数按位相加,不考虑进位(即做异或操作);
2. 处理第一步没有考虑的进位,将两个数按位相与,将结果左移一位;
3. 将第一步和第二步的结果相加,如果产生进位,继续重复前两步,直到不产生进位为止;
这个思路就是将十进制运算转换成二进制运算:
两个二进制数相加运算没有进位时,结果为两个数的异或;当相加有进位时,先处理不用进位的,后处理进位问题。
代码实现:
int Add(int n1,int n2)
{
int xor,carry;
do{
xor = n1 ^ n2; //第一步:不考虑进位,进行异或运算
carry = (n1 & n2) << 1;//第二步:进一位
n1 = xor;
n2 = carry;
}while(n2!=0);//第三步:进位为0,结束运算
return n1;
}
相关问题:
不使用新的变量,交换两个变量a,b的值:
- 基于加减法:
a = a + b;
b = a - b;
a = a - b;
- 基于异或运算:
a = a ^ b;
b = a ^ b;
a = a ^ b;