写一个函数返回参数二进制中 1 的个数
比如:15 二进制为: 0000 1111
有四个1
程序原型:int count_one_bits(unsigned int value)
{
// 返回 1的位数
}
如果让我们求一个十进制数中1 的个数,我们会将这个数除以10之后看余数是不是1,然后将得到的商除以10看余数是不是1,依次类推,直到商为0.
如下图解释:
例如
十进制数:516
516/10=51......6 6!=1
51/10=5......1 1==1 只有一个1
5/10=0......5 5!=1
商 余数
那么我们求二进制数的时候也一样,将二进制除以2,看得到的余数是不是1,再用商除以2,一直到商为0为止。
如图:
代码如下:
#include<stdio.h>
#include<stdlib.h>
int count_one_bits(unsigned int value)
{
int num = 0;
while(value)//value为0时跳出循环
{
if(value%2)//如果余数为1,则num自加1
num++;
value = value/2;//将得到的商再付给value
}
return num;
}
int main()
{
int i = 0;
int num = 0;
printf("请输入一个正数:");
scanf("%d",&i);
num = count_one_bits(i);//num为记录1 的个数
printf("num=%d\n",num);
system("pause");
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
结果:
num=4
还可以用位运算解这道题。
代码如下:
#include<stdio.h>
#include<stdlib.h>
int count_one_bits(unsigned int value)
{
int num = 0;
while(value)
{
if( (value&1) ==1)
num++;
value>>=1;//右移
}
return num;
}
int main()
{
int i = 0;
int num = 0;
printf("请输入一个正数:");
scanf("%d",&i);
num = count_one_bits(i);
printf("num=%d\n",num);
system("pause");
return 0;
}