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

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

一.

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

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
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为例测试 ,结果为

二.

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

若让一个数与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;
}

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值