剑指 Offer 65. 不用加减乘除做加法

150 阅读2分钟

剑指 Offer 65. 不用加减乘除做加法

十进制加法,我们一般是是怎么做的呢, 举例来说5+17=22

  1. 第一步只做个位相加不进位,5+7=12
  2. 第二步进位:5+7有进位,进位的值是10
  3. 第三步把前面两个结果加起来12+10为22

现在如果是二进制,5的二进制是101,17的二进制是10001

  1. 第一步个位相加但不进位,得到的结果是10100(最后一位两个数都是1,相加的结果是二进制的10,但是这一步不计进位,因此结果仍然是0)
  2. 第二步进位:当前例子中只有最后一位相加时产生了一个进位,结果是二进制的10
  3. 第三步把前两步的结果相加,得到的结果是10110,转换成十进制正好是22

现在把二进制的加法用位运算来替换

  1. 第一步不考虑进位,对每一位相加,0+0,1+1的结果是0,0+1,1+0的结果都是1(这异或的结果一样)
  2. 每二步进位:0+0,0+1,1+0都不会产生进位;只有1+1才会向前生产一个进位(此时我们可以想象成两个数先做位与运算,然后再向左移动一位)
  3. 第三步把前两步的结果相加:第三步相加的的过程依然是重复前两步,直到不产生进位为止
var add = function (a, b) {
    do {
        var mid = a ^ b
        b = (a & b) << 1
        a = mid
    } while (b !== 0)
    return a
}

剑指 Offer 64. 求1+2+…+n

var sumNums = function (n) {
  return n && n + sumNums(n - 1);
};