剑指offer–(11)二进制中1的个数
问题描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路描述
利用”与”操作,不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0,这种方法速度比较快,其运算次数与输入n的大小无关,只与n中1的个数有关。如果n的二进制表示中有M个1,那么这个方法只需要循环k次即可,所以其时间复杂度O(M),eg: 111&110 =110 消除了111最右边的1。
代码实现:
public class Solution {
public int NumberOf1(int n) {
int num=0;
while(n!=0){
n=n&(n-1);//消除最右边的1
num++;
}
return num;
}
}