十进制加法,我们一般是是怎么做的呢, 举例来说5+17=22
- 第一步只做个位相加不进位,5+7=12
- 第二步进位:5+7有进位,进位的值是10
- 第三步把前面两个结果加起来12+10为22
现在如果是二进制,5的二进制是101,17的二进制是10001
- 第一步个位相加但不进位,得到的结果是10100(最后一位两个数都是1,相加的结果是二进制的10,但是这一步不计进位,因此结果仍然是0)
- 第二步进位:当前例子中只有最后一位相加时产生了一个进位,结果是二进制的10
- 第三步把前两步的结果相加,得到的结果是10110,转换成十进制正好是22
现在把二进制的加法用位运算来替换
- 第一步不考虑进位,对每一位相加,0+0,1+1的结果是0,0+1,1+0的结果都是1(这异或的结果一样)
- 每二步进位:0+0,0+1,1+0都不会产生进位;只有1+1才会向前生产一个进位(此时我们可以想象成两个数先做位与运算,然后再向左移动一位)
- 第三步把前两步的结果相加:第三步相加的的过程依然是重复前两步,直到不产生进位为止
var add = function (a, b) {
do {
var mid = a ^ b
b = (a & b) << 1
a = mid
} while (b !== 0)
return a
}
var sumNums = function (n) {
return n && n + sumNums(n - 1);
};