【正确答案】
【答案解析】问题描述:给定一个整数,输出这个整数二进制表示中1的个数,例如,给定整数7,其二进制表示为111,因此输出结果为3。
该问题可以采用位操作来完成。具体思路如下:首先,判断这个数的最后一位是否为1,如果为1,则计数器加1,然后,通过右移丢弃掉最后一位。循环执行该操作直到这个数等于0为止。在判断二进制表示的最后一位是否为1时,可以采用与运算来达到这个目的。具体实现代码如下:
public class Test{
public static int countOne(int n){
int count=0; //用来计数
while(n>0){
if((n&1)==1)//N断最后一位是否为1
count++;
n
>
>
=1; //移位
}
return count;
public static void main(String[]args){
System.ouL println(countOne(7));
System.out.println(countOne(8));
}
}
程序运行结果为:
3
1
以上这个算法的时间复杂度为O(n),其中n代表二进制数的位数。由于题目要求求出1的个数,此时可以只考虑1的个数,把二进制表示中的每个1看作独立的个体,利用上一节中介绍的算法可以求出1的个数。给定一个数n,每进行一次n&(n-1)计算,其结果中都会少了一位1,而且是最后一位。利用这个特性可以编写出如下代码:
public class Test{
public static int c(rant()ne(int n){
int count=0; //用来计数
while(n>0){
if(n!=0)//判断最后一位是否为1
n=n&(n-1);
count++;
}
return count;
}
public static void main(String[]args){
System out.println(countOne(7));
Systenm.out.println(countone(8));
}
}
程序运行结果为:
3
1
改进后的算法时间复杂度为O(m),其中m为二进制数中1的个数,显然在二进制数中1的个数比较少时,这个算法的效率更高。