Leetcode 371

我们先用最朴素的方法来思考这道题,那就是逐位进行运算。

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);

原文地址:https://www.cnblogs.com/KakagouLT/p/15336622.html