求出一个整数的二进制含1的个数
function f(i) {
var j = 0;
while (i > 0) {
i = i & (i - 1);
j++;
}
return j;
}
原理:
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
// ....依次类推