巧用位运算: 1、num1 & num2,与运算,得到的是2个数都是1的位置,如果进行加法,则需要进位,m =(num1 & num2)<< 1,得到进位后的数。
2、num1 ^ num2,异或,得到的是2个数1个为0另一个为1的位置,如果进行加法,则不需要进位。n = num1 ^ num2,此时如果m + n得到的就是两数之和,但不能做加法,此时我们想到了或运算。但如果将m、n直接进行或运算,无法保证不进位,于是我们重复以上的过程。
3、while(n & m),当n与上m得0 的时候,即再也不需要进位了,此时将m | n返回即可。
最终代码:
int Add(int num1, int num2 ) {
int m = 0;
int n = 0;
m = (num1 & num2) << 1; // 需要进位
n = num1 ^ num2; //无需进位 此时m + n就是答案,但不能做加法
while(n & m) // 检查是否还需要进位
{
num1 = m;
num2 = n;
m = (num1 & num2) << 1; //需要进位
n = num1 ^ num2; //无需进位
}
return m | n;
}