C语言之写一个函数求一个数的二进制(补码)表示中有几个1

首先,我这里有三种方法。

一.

我们知道的是他是二进制数,我们可以一位一位的判断是不是1。这里,我们可以联想到在求一个十进制数的每一位用到的方法,先取模10,得到最后一位,再整除10去掉该位。所以,用到二进制数里面,我们就变成了%2和/2。

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include 
int count_bit(unsigned int m)//注意这里是无符号
{
	int count = 0;
	while (m)
	{
		if (m % 2 == 1)
		{
			count++;
		}
		m /= 2;
	}
	return count;
}
int main()
{
	int i = 0;
	scanf("%d", &i);
	int count = count_bit(i);
	printf("%d", count);
	return 0;
}

这里,我用-1为例测试 ,结果为

C语言之写一个函数求一个数的二进制(补码)表示中有几个1_第1张图片

二.

这里,跟第一种方法相差不大,只是这里我们用到了移位操作符>>。

若让一个数与1进行按位与操作,,则它的最后一个二进制位为1则得到1,为0得到0。

所以我们借助循环和>>与&这两个操作符,判断每一位是否为1。

代码如下:

int count_bit(int m)//这里就用有符号即可。
{
	int count = 0;
	for (int j = 0; j < 32; j++)//整形有32位
	{
		if ((m >> j && 1) == 1)
		{
			count++;
		}
	}
	return count;
}
int main()
{
	int i = 0;
	scanf("%d", &i);
	int count = count_bit(i);
	printf("%d", count);
	return 0;
}

三.

 第三种的精髓还是按位与&这个操作符。其实有种方法可以让一个数的二进制位中1一个一个的消除,不管它在哪儿,当然是从最低位开始。就是n&(n-1),大家可以试试。所以这里用while循环,当n二进制位全为0时停止循环,即n=0。

代码如下:

int count_bit(int m)
{
	int count=0;
	while (m)
	{
		m = m & (m - 1);
		count++;
	}
	return count;
}
int main()
{
	int i = 0;
	scanf("%d", &i);
	int count = count_bit(i);
	printf("%d", count);
	return 0;
}

至此,三种方法都已经介绍完,希望有帮助。

祝:“码”思泉涌,下“指”如有神。 

你可能感兴趣的:(c语言,算法,开发语言,学习方法)