题目要求:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
仔细一看这题颇有意思,求两个数之和,而且不让用运算符,那么我们就要从二进制入手了。现在假设我们这来那个数分别为12和9,对应的二进制为:1100和1001
首先只做加法,不考虑进位问题。结果为0101。相当于做异或运算,(1100^1001)=0101
- 接着只考虑进位。只有1+1会发生进位,所以相当于做按位与运算, 得到结果:(1100&1001)=1000
- 在二进制中,1+1会发生进位。所以对于第二步的结果应该采用左移1位 1000<< = 10000
重复上面的步骤,对0101和10000进行加法运算
- 算出异或运算0101^10000=10101
- 计算进位,(按位与运算)0101&10000=00000
** 结果为0,所以10101就是二进制加法1100和1001的最后结果。换算为十进制就是21**
用程序语言描述是这个样子的:
public int Add(int num1,int num2) {
while (num2!=0) {
int a = num1^num2;
num2 = (num1&num2)<<1;
num1 = a;
}
return num1;
}