题目:

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

常规思路很清晰,将该数字和 1 按位与,如果结果是 1 则表明该数字最右一位是 1,如果结果是 0 则表明该数字最右一位是 0。不断将该数字右移,最终即可得到结果。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
public class Solution {
public int NumberOf1(int n) {
int res = 0;
while (n != 0) {
if ((n & 1) == 1){
res ++;
}
n >>>= 1;
}
return res;
}
}

按照Java的结构,一个int型数字最长32位,所以只需要循环32次即可求得结果。

当然有一个更简单的解法,把一个整数减去 1,再和原整数做按位与运算,会把该整数最右边一个 1 变成 0。那么一个整数的二进制表示中有多少个 1,就可以进行多少次这样的操作。 例如数字 9(1001):

  1. 1001 & (1001 - 1) = 1000
  2. 1000 & (1000 - 1) = 0

一共进行两次,运算进行的次数就是最后的结果,代码实现如下:

1
2
3
4
5
6
7
8
9
10
public class Solution {
public int NumberOf1(int n) {
int res = 0;
while (n != 0) {
res ++;
n = (n - 1) & n;
}
return res;
}
}