1.问题描述:给定一个整数,统计其对应的二进制中含有1的个数。比如8(0000 1000),对应的二进制数中,只含有一个1.
2.设计思路:对x取余:z=x%2。如果z!=0,说明x的末尾不是为1.对于一个二进制x4x3x2x1进行分析,x1代表了1,x2代表了2,x3代表了4,x4代表了8。所以,可以将x循环往右移动(x=x>>1),如果x对应的二进制数中含有1,它一定会被移动到最低位上(x1)。那么此时,x所表示的数一定为奇数(x4x3x2x1中,只有x1为1,时所表示的数才为奇数)。当x为奇数时,x%2的结果为1。重复上述过程,直到x为0,便可以统计出x中含有1的个数。
3.代码:
#include <stdio.h>
/*统计一个十进制整数,对应的二进制数中含有1的个数*/
int count(int x)
{
int con = 0;
while(x)
{
if(x%2 != 0) //当x%2不等于0时,表示此时,x对应的二进制数的最低位上存在一个1
{
con++;
}
x = x >> 1; //往右移移位,即x = x / 2
}
return con;
}
int main()
{
int ans;
int a;
printf("输入一个整数:\n");
scanf("%d",&a);
ans = count(a);
printf("含有1的个数为:%d\n",ans);
return 0;
}
4.运行结果:
5.总结:
统计一个整数对应的二进制数中含有多少个1,可以将整数x转换成二进制来分析。当二进制数的最低位为1时,x%2的结果一定为1。然后将x往右移动一位(x = x >> 1)。重复上述过程,直到x为0时,结束循环,便可以得到x中含有多少个1。