剑指 offer:不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

正常加法操作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;
    }
}

猜你喜欢

转载自blog.csdn.net/raylrnd/article/details/82729153
今日推荐