题目
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
分析
不能使用加减乘除,就只剩下移位操作可以使用了。
十进制的5+7的计算方式:
(1)相加各数位的值,不进行进位,结果是2;
(2)看是否有进位,这一步的到10,加入是0,就没有进位;
(3)2+10 = 12
扩展到二进制:
5的二进制101;7的二进制111.
(1)不进位,101^111=010
(2)进位,按位与,并左移一位。101&111=101,左移一位,1010
(3)重复步骤一和步骤二。1010^010 = 1000, 1010 & 010 = 10,左移一位100。接着1000^100 = 1100;1000&100 = 0000,因此结果就是1100.
这里注意一下异或,异或是对应位置不一样就是1,加入1000 和 111 异或,最低三位一一对应,都变成1,最高位没有与之对应的数,直接是原来的数,最终结果是1111.
而按位与就不一样,0&0=0,0&1= 0,1&1 = 1,1001与111按位与,最低三位是001,第一位没有与之对应的,直接是0,可以看做1&0=0.
综上分析:
代码
public int Add(int num1,int num2) {
while (num2 != 0) {
int temp = num1 ^ num2;
num2 = (num1 & num2)<<1;
num1 = temp;
}
return num1;
}