方法一:
注意:
(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;
}