题目
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
思路
一个二进制数1100
,它的第二位是从最右边数起的一个1
。减去1后,第二位变成0,它后面的两位0变成1,而前面的1保持不变,因此得到的结果是1011
。我们发现把一个整数减去1,都是把最右边的1变成0
。如果它的右边还有0的话,所有的0都变成1
,而它左边所有位都保持不变
。接下来我们把一个整数和它减去1的结果做位与运算,相当于把它最右边的1变成0。还是以前面的1100
为例,它减去1的结果是1011
。我们再把1100和1011做位与运算
,得到的结果是1000
。我们把1100
最右边的1变成了0,结果刚好就是1000
。
把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
实现
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while (n != 0) {
++count;
n = n & (n - 1);
}
return count;
}
}