简介
今天用三种方法来求出二进制位中1的个数
正文
方法一:取余求1的个数
因为是二进制位,所以%2就是最后一位的数字,然后加到count中(因为二进制中只有0和1),然后/2将最后一位去掉。最后count就是二进制位中1的个数。(但是只针对正整数)
代码如下:
#include<stdio.h>
int count_one_bits(unsigned int value)
{
int count = 0;
while(value)
{
count = count + value%2;
value /= 2;
}
return count;
}
int main()
{
int n = 0;
int ret = 0;
printf("请输入一个整数:>");
scanf("%d",&n);
ret = count_one_bits(n);
printf("有%d位1\n",ret);
return 0;
}
方法二:位运算法
用该数按位与1得到最后一位二进制数,判断如果等于1,计数器count++,然后该数右移一位,循环判断,直到右移到该数变为0。(但是要循环32次)
代码如下:
#include<stdio.h>
int count_one_bits(unsigned int value)
{
int count = 0;
while(value)
{
if((value&1) == 1)//模1取最低位数字
{
count++;
}
value >>=1;
}
return count;
}
int main()
{
int n = 0;
int ret = 0;
printf("请输入一个整数:>");
scanf("%d",&n);
ret = count_one_bits(n);
printf("有%d位1\n",ret);
return 0;
}
方法三:位运算(效率较上一种较高)
这种方法较上两种方法的效率都比较高,将该数每次减1然后与原数进行按位与运算,该数中有多少个1就会进行多少次按位与运算。
代码如下:
#include<stdio.h>
int count_one_bits(unsigned int value)
{
int sum = 0;
while(value)
{
value = value & (value-1);
sum++;
}
return sum;
}
int main()
{
int n = 0;
int ret = 0;
printf("请输入一个整数:>");
scanf("%d",&n);
ret = count_one_bits(n);
printf("有%d位1\n",ret);
return 0;
}