二进制数中1的个数

本文介绍了三种方法计算二进制数中1的个数,特别指出法二和法三适用于unsigned int类型,可以处理负数情况。法一利用位操作n = n & (n - 1)不断移除二进制末尾的1,通过判断num是否为0确定1的数量。此外,这种方法还可用于检测一个数是否为2的幂,以及计算两个数间不同比特位的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求二进制数中1的个数:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//法一
int count_one_bits(int n)
{
	int count = 0;
	while(n)
	{
		n=n&(n-1);
		count++;
	}
	return count;
}

int main()
{
	int num = -1;
	int ret = count_one_bits(num);
	printf("%d\n",ret);
	return 0;
}

//法二
int count_one_bits(unsigned int value) 
{
	int count = 0;
	while(value)
	{
		if(value%2 == 1)
		{
			count++;
		}
		value /= 2;
	}
	return count;
}

int main()
{
	unsigned int num = 0;
	int ret = 0;
	scanf("%d",&num);
	ret = count_one_bits(num);
	printf("%d\n",ret);
	return 0;
}

//法三
int count_one_bits(unsigned int value) 
{
	int count = 0;
	while(value)
	{
		if(value&1 == 1)
		{
			count++;
		}
		value >>= 1; 
	}
	return count;
}
int main()
{
	unsigned int num = 0;
	int ret = 0;
	scanf("%d",&num);
	ret = count_one_bits(num);
	printf("%d\n",ret);
	return 0;
}

法二法三的函数参数类型为unsigned int 可以解决num为负数的情况,若是将参数类型改为int 法二法三将无法解决num为负数的情况。

法一通过n=n&(n-1);来求取二进制中1的个数,如上图所示,每进行一次按位与运算,num最右边的1就会丢掉,通过判断num为不为0,便可知道num中1的个数。

这种方法还可以用来判断一个数是不是2的k次方,如果一个数是2的k次方,那么这个二进制数中就只有一个1,则数num和num-1进行按位与运算就会得到0,通过判断num&(num-1)是否为0,就可以判断这个数是不是2的k次方。

求取两个数中有多少个不同的比特位也可以使用这种方法,代码如下。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//法一
int main()
{
	int a = 0;
	int b = 0;
	int count = 0;
	scanf("%d%d",&a,&b);
	while(a||b)
	{
		if((a&1) != (b&1))
			count++;
		a >>= 1;
		b >>= 1;
	}
	printf("%d\n",count);
	return 0;
}

//法二
int count_one_bits(int n)
{
	int count = 0;
	while(n)
	{
		n=n&(n-1);
		count++;
	}
	return count;
}

int main()
{
	int n1 = 0;
	int n2 = 0;
	int ret = 0;
	int num = 0;
	scanf("%d%d",&n1,&n2);
	num = n1^n2;
	ret = count_one_bits(num);
	printf("%d\n",ret);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值