题目
模拟十位数相加的方法
public int getSum(int a, int b) {
// 当b为0的时候, 直接返回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, 那么每一位相加的结果就是结果