【C语言技巧】巧妙地求二进制中1的个数

在代码的题目中,我们有时会遇到需要求二进制数字中1的个数的情况,那么今天博主就带大家一起学习一种很巧妙的,求二进制中1的个数的写法

普通方法1

原理:

通过位移操作符>>和按位与&操作符,让输入的数字每一位和1进行“与”的操作,这样就可以判断末位的数字是否是1,如果末位是1则使用变量count++,是0就不++,这样就可以统计出1的个数。

代码示范:

int main() 
{
    
    
	int a = 0;
	int i = 0;
	int count = 0;
	scanf("%d", &a);
	for(i=0;i<a;i++)
	{
    
    
		if ((a >> i) & 1)
			count++;
	}
	printf("%d", count);
	return 0;
}

编译结果:

普通方法2

原理:

当我们判断10进制的每一位时,我们会时候“%10”“/10”的方法,对十进制数字不断地取最后一个数然后再将其“砍掉”。那么在二进制中同理,不断地“%2”“/2”即可达成我们想要的效果。
不过需要注意,如果题目中要求,输入负数的时候判断其补码,那么这里的整型就不能用int了,需要用无符号整型unsigned int,这是因为在 %2 和 /2 的过程中计算出现错误导致的,其他方法没有这个问题。

代码示范:

int main()
{
    
    
	unsigned int a = 0;
	int count = 0;
	scanf("%d", &a);
	while (a)
	{
    
    
		if (a % 2)
			count++;
		a /= 2;
	}
	printf("%d", count);
	return 0;
}

编译结果:

巧妙方法

原理:

关于这个方法,有一个非常巧妙的公式我们需要了解:
n=n&(n-1)
这个公式有多巧妙呢?我们可以举个例子看一下:
比如说5,二进制是111
111&(111-1)=111&110=110
110&(110-1)=110&101=100
100&(100-1)=100&11=0
仔细观察,我们可以发现,每次使用这个公式,最末尾的1都会被“消灭”掉,所以想要判断二进制中有几个1,只需要看这个数字用了几次这个公式会变成0就可以了。

代码示范:

int main()
{
    
    
	int a = 0;
	int count = 0;
	scanf("%d", &a);
	while(a)
	{
    
    
		a = a & (a - 1);
		count++;
	}
	printf("%d \n", count);
	return 0;
}

编译结果:

image.png

拓展:判断2的幂次方

原理:

当一个数字是2的幂次方的时候,在二进制中,只有一个1,剩下的都是0,那么知道了这一点,我们如何进行判断一个数字是不是2的幂次方呢?
思考1(冗余):将上面的代码复制过来,如果判断一个数字只有1个1,就是2的幂次方。
虽然可以,但是没必要,还是比较冗余。
思考2(正确思路):直接运行一次公式,如果这个数字是2的幂次方,那运行一次之后直接就是0。
比如10000,运行一次就是和1111按位与,直接就是0了,如果是0就是2的幂次方,如果不是0就不是。

代码示范:

int main() 
{
    
    
	int a = 0;
	int i = 0;
	int count = 0;
	scanf("%d", &a);
	if (a & (a - 1))
		printf("不是2的幂次方");
	else
		printf("是2的幂次方");
	return 0;
}

编译结果:

image.png
image.png

扫描二维码关注公众号,回复: 17295860 查看本文章

写在最后

如果本文对您有帮助,可不可以给我一个小小的点赞呀❤~您的支持是我最大的动力。

博主小白一枚,才疏学浅,难免有所纰漏,欢迎大家讨论和提出问题,博主一定第一时间改正。

谢谢观看嘿嘿(๑•̀ㅂ•́)و✧~!

猜你喜欢

转载自blog.csdn.net/weixin_70218204/article/details/132101082
今日推荐