剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

116 阅读1分钟

剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

var countBits = function (n) {
    var arr = new Array(n + 1).fill(0);
    for (var i = 0; i <= n; i++) {
        arr[i] = f(i);
    }
    return arr
    function f(i) {
        var j = 0;
        while (i > 0) {
            i = i & (i - 1);
            j++;
        }
        return j;
    }
}

关键点:求出一个整数的二进制含1的个数

function f(i) {
    var j = 0;
    while (i > 0) {
        i = i & (i - 1);
        j++;
    }
    return j;
}

image.png

0b111111111 === 511 // true
2**8 + 2**7 + 2**6 + 2**5 + 2**4 + 2**3 + 2**2 + 2**1 + 2**0 // 511
0b111111110 === 510 // true
2**8 + 2**7 + 2**6 + 2**5 + 2**4 + 2**3 + 2**2 + 2**1 // 510

511 & 510 === 0b111111111 & 0b111111110
// => 2**8 + 2**7 + 2**6 + 2**5 + 2**4 + 2**3 + 2**2 + 2**1  这里消灭了一个1

510 & 509 === 0b111111110 & 0b111111101
// => 2**8 + 2**7 + 2**6 + 2**5 + 2**4 + 2**3 + 2**2  这里消灭了一个1

// ....依次类推