两整数之和

129 阅读1分钟

题目

image.png

模拟十位数相加的方法

    public int getSum(int a, int b) {
        // 当b0的时候, 直接返回a
        while (b != 0) {
            // 计算a, b 两个数字化成二进制后各个位置相加的情况, 两个数字直接异或即可
            // 这里如果有向更高位的进位的话, temp是体现不出来的
            int temp = a ^ b;

            // 获得是否有进位, 两个数字相与, 这样之前第一步计算temp的时候, 每一位的进位都体现出来了
            // 然后将结果左移一位, 进位全部移动到了正确的位数上
            b = (a & b) << 1;

            // 如果进位b不为0, 继续将进位和没考虑进位的数字相加
            // 这里复用了a, b变量
            a = temp;
        }

        return a;
    }

思路

(1) 先计算每一位相加的结果,

(2) 再计算每一位相加产生的进位的结果, 通过左移一位, 移动到正确的位数上

(3) 如果进位不为0, 继续将步骤1和步骤2得到的元素, 重新作为输入, 重复步骤1和步骤2.

(4) 直到进位不为0, 那么每一位相加的结果就是结果