(C语言)用三种方法求一个整数存储在内存中的二进制中1的个数

目录

常用的位操作符

位操作符的应用:统计二进制中1的个数

方法一:先求二进制位,再统计

方法二:位运算(整数的每个二进制位 & 1)

方法三:采用相邻的两个数据进行按位与运算


这其实是位操作符的一种应用,如果能熟练掌握位操作符,真的可以发现新大陆!!

先简单介绍一下常用的位操作符

&  : 按位与(只有两个二进制位位同时为1,结果才为1,否则为0)

 |   : 按位或(只要有一个二进制位是1,结果就是1,只有两位都是0 ,结果才为0)

 ^  : 按位异或(两个二进制位相同结果为0,不同结果为1)

<< :   把二进制位左移一位

>> :   把二进制位右移一位

~  :   把二进制位全部取反

位操作符的应用:统计二进制中1的个数


方法一:先求二进制位,再统计

思路:

        循环进行以下操作,直到整数n被缩减为0:

         1. 用n模(%)2,检测其是否能够被2整除

         2. 如果可以:则n对应二进制比特位的最低位一定是0,否则是1,如果是1给计数加1

         3. 如果n不等于0时,继续第1步

代码实现:

int count_one_bit(int n)
{
	int count = 0;
	while(n)
	{
		if(n%2==1)
			count++;
		n = n/2;
	}
	return count;
}

缺陷:

        进行了大量的取模以及除法运算,取模和除法运算的效率本来就比较低。

方法二:位运算(整数的每个二进制位 & 1)

代码实现:

int count_one_bit(unsigned int n)
{
	int count = 0;
	int i = 0;
	for(i=0; i<32; i++)
	{
		if(((n>>i)&1) == 1)
			count++;
	}
	return count;
}

优点:

        用位操作代替取模和除法运算,效率稍微比较高

缺陷:

        不论是什么数据,循环都要执行32次

方法三:采用相邻的两个数据进行按位与运算

思路:

        令n = n & (n-1),一直循环

        此种方式,数据的二进制比特位中有几个1,就循环几次,知道n为0为止

代码实现:

int count_one_bit(int n)
{
	int count = 0;
	while(n)
	{
		n = n&(n-1);
		count++;
	}
	return count;
}

猜你喜欢

转载自blog.csdn.net/m0_64051621/article/details/126111241