参考自:《剑指Offer——名企面试官精讲典型编程题》
题目:二进制中1的个数
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如:把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
主要思路:把一个整数减去1,都是把最右边的1变为0。如果它的右边还有0,则其右边所有的0变为1,其左边的所有位保持不变。因此,把一个整数和它减去1的结果做位与运算,相当于把它最右边的1变为0,如此运算,直到该数变为0,则运算的次数即为1的个数。
例如:1100 ; 1100-1 =1011; 1100&1011 =1000
扩展:该方法也可以用于判断某个整数是不是2的幂次方,即该整数在二进制表示中是否只有1个1。
关键点:位运算
时间复杂度:O(n),n为所求数中1的个数
public class NumberOfOneInBinary
{
public static void main(String[] args)
{
int n = 9;
System.out.println(numberOfOne(n)); //2
int n1 = 0x7FFFFFFF;
System.out.println(numberOfOne(n1)); //31
}
private static int numberOfOne(int n)
{
int count = 0;
while (n != 0)
{
n = n & (n - 1);
++count;
}
return count;
}
}