问题描述: 计算出二进制数中1的个数。
解法一:循环计数
解法与分析: 使用一个数1来“与”二进制数中每一位,若值为1则1的个数加一。
参考代码如下
/**
* 通过flag左移做一个循环来与num的每一位,若与计算的结果不为0,则1的个数++
* @param num
* @return
*/
public static int calc2(int num)
{
int count=0;
int flag=1;
while (flag!=0)
{
if((num&flag)!=0)
{
count++;
}
flag<<=1;
}
return count;
}
解法二:最佳算法
解法与分析: 设二进制数为num,若num不为0时,num-1后的值与num相与都会消除一个1,按照这一点,可以很快计算出1个个数。
参考代码如下
/**
* num不为0时,num-1后的值与num相与都会消除一个1,按照这一点,可以很快计算出1个个数,最佳算法
* @param num
* @return
*/
public static int calc3(int num)
{
int count=0;
while (num!=0)
{
num=num&(num-1);
count++;
}
return count;
}
- 附:源码地址

本文介绍了两种计算二进制数中1的个数的方法:循环计数和最佳算法。最佳算法通过位操作快速计算1的数量,避免了传统循环的冗余计算。
2181

被折叠的 条评论
为什么被折叠?



