写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
正常加法操作a+b = a 带进位相加 b = a不带进位相加b的结果 + (a+b的)进位数1 (其中 “+” 相当于进位相加)
根据迭代关系可以得出:
正常加法操作a+b
= a不带进位相加b结果 带进位相加 (a+b的)进位数1
= “a不带进位相加b结果” 不带进位相加 “进位数1” 的结果 + (“a不带进位相加b结果”+“进位数1” 的)进位数2
...
什么时候结束到头呢,很简单,当“+”右边的数为0,结果就是“+”左边的数。
即(“a不带进位相加b结果”+“进位数1” 的)进位数2 == 0 时,结束。
也就是说当中间变量相加不产生进位时循环结束。
利用如下结论
不带进位相加 = a ^ b
进位数 = (a & b) << 1
可以得出:
a + b
= a ^ b + (a & b) << 1
= (a ^ b) ^ ((a & b) << 1) + ((a ^ b) & ((a & b) << 1)) << 1
...
当 ((a ^ b) & ((a & b) << 1)) << 1 == 0 时结束循环
public class Solution {
public int Add(int num1,int num2) {
while (num2!=0) {
int temp = num1^num2;
num2 = (num1&num2)<<1;
num1 = temp;
}
return num1;
}
}