[c语言]求二进制位1的

简介

  今天用三种方法来求出二进制位中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;
}

猜你喜欢

转载自blog.csdn.net/Code_beeps/article/details/83450257