您的位置:首页 > 其它

写一个函数返回参数二进制中 1 的个数

2016-11-09 11:58 218 查看
方法一:

注意:
(1)这种方法是采取按位于,即让索要判断的数和1 与,可以判断最后一位是0还是1,然后每判断一次
向右移动一位再判断下一位,以此类推循环32次,即可知道这个数的每一位情况

#include <stdio.h>
int main ()
{
int num=0,i=0,count=0;
scanf("%d",&num);
for(i=0;i<32;i++)  //只是控制循环32次(每个整型数按32位来计算)
{
if((num&1)==1)
{
printf("1 ");  //如果某一位与1的结果为1,则这个位上是1
count++;   //计数器计算1的个数
}
num=num>>1;  //没判断完一位,这个数向右移动1位,再判断下一位
}
printf("\n");
printf("count=%d",count);
return 0;
方法二:

注意:

(1)这种方法本质上和下一种是一样的,只是这种表面看起来是二进制数向右移动0,1,2...31位,这

个只是相对于这个数原来的样子,其实每次也是一位一位判断的,这个和另一种一定要加以区分

#include <stdio.h>
int main ()
{
int num=0,i=0,count=0;
scanf("%d",&num);
for(i=0;i<32;i++)
{
if((num>>i)&1==1)  //每次移动i位再和1进行与,i从0到31,也是判断每一位1还是0
{
count++;
printf("1 ");
}
}
printf("\n");
printf("count=%d",count);
return 0;
}


方法三:(最优化)

        这种方法非常简便,根据一个整数每次和比自己小一的数按位与,结果会使得原来的这个整数的二进制位少一个1这个特点,可以设置一个循环,直到这个数到0为止,每

循环一次,count自增1,说明记录一个1

#include <stdio.h>
int main ()
{
int num=0,i=0,count=0;
scanf("%d",&num);
while(num)
{
num=(num)&(num-1);
count++;
}
printf("count=%d",count);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: