1. 题目

请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如把 9 表示成二进制是 1001,有 2 位是 1。因此如果输入 9,该函数输出 2。

2. 思路

注意到,如果要判断一个二进制数指定位数是否为 1,比如这个二进制数是 1011。那么只需要构造除了这个位为 1,其他位为 0 的二进制即可,这个例子是 0100。

两者进行&运算,如果结果为 0,那么指定位数不为 1;否则为 1。

现在事情就简单了,只要准备数字1,每次与原数进行&操作,然后左移1
重复前面的步骤,就能逐步比较出每一位是不是1

3. 代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* @param {Number} n
*/
function numberOf1(n) {
let count = 0,
flag = 1

while (flag) {
if (flag & n) {
++count
}

flag = flag << 1
}

return count
}

/**
* 测试代码
*/

console.log(numberOf1(3))

注意:有更好的实现思路,请见“02-二进制中 1 的个数进阶版”。