1. 题目

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

2. 思路

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

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

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

3. 代码实现

/**
 * @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));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

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