题目
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
就很恶心。我个人感觉被恶心到了。
解
思路是这样的:对于两个数a1和b1,比如说5和7,101和111
- 先按位与,结果为101。如果与的结果存在某个位为1,说明a和b两个数,的二进制数中,存在相同的位为1的情况,记为进位位。因为该位置,两个数对应位置都为1,产生进位,进位的值为1;产生的这个进位是要加到前面一位上的。所以对按位与的结果进行向左移位1位的操作,结果为a,供之后使用。
- 如果按位与的结果中,不存在某一位为1,即按位与的结果为0,说明这两个数的二进制位每一位都不产生冲突(没有哪一位,两个数在该为都为1)。则直接进行a|b(对应位相加,即可的结果。返回。)
- 按位异或,结果为010。如果异或的结果中存在某个为为1,说明在原本的二进制数中,该位只有一个数取值为1,即不会产生进位,记为非进位位;记异或的结果为b。
- 此时,计算a+b的结果,其实就等于a1+b1的结果。由于不能使用+运算,所以重复上面的步骤,直至按位yu的结果为0,即可停止,通过|操作,获得两个数的和。
public int Add(int num1,int num2) {
int a = (num1 & num2) << 1;
int b = (num1 ^ num2);
while((a & b) != 0){
num1 = a;
num2 = b;
a = (num1 & num2) << 1;
b = (num1 ^ num2);
}
return (a | b);
}