我们先用最朴素的方法来思考这道题,那就是逐位进行运算。
bit[i] = a[i] + b[i] + carry[i]
if a[i] + b[i] + carry[i] >= 10: carry[i+1] = 1
但是我们不能使用加法,也没有加法器元件,因此我们只能自己来总结规律。
0 + 0 = 0
1 + 0 = 1
0 + 1 = 1
1 + 1 = 10
可以看到本位的运算结果是 a ^ b,而进位的运算结果是 a & b << 1
那么刚刚的算法就可以拆分为:
bit[i] = a[i] ^ b[i]
tempcarry[i+1] = a[i] & b[i] << 1
bit[i] = carry[i] ^ bit[i]
tempcarry[i+1] = tempcarry[i+1] | (carry[i] & bit[i] << 1) // 这一步必然不可能会发生进一步的进位,所以是取或
---
carry = tempcarry
但是这样很复杂,我们可以试着去分离一下:我们不需要逐位地去进行 a + b + carry 的操作,而是先计算 c = a ^ b,然后计算 carry = a & b << 1,最后计算 c + carry,以此类推,直到carry没有为止。
这样就得到了:
return b == 0 ? a : getSum(a ^ b, (a & b) << 1);