C语言---求一个整数存储在内存中的二进制中1的个数

题目:求一个整数存储在内存中的二进制中1的个数

首先,我们要明白整数储存在电脑中是以二进制的补码来进行存储的

如 5 的存储型式为 0000 0000 0000 0000 0000 0000 0000 0101(因为是整型1个字节8位,所以总共32位,这里不过多讲解)

我们一开始写的代码可能和如下的代码有着相同的问题:


#include <stdio.h>
int main()
{

	int i=0;
	int count=0;
	scanf("%d",&i);
	 while(i)
	 {
	 	if(i%2==1)
	 
		 count++;
	     i=i/2;
		 
	  } 
	  printf("%d\n",count);
	
	return 0;
}

-1 的存储型式为 1111 1111 1111 1111 1111 1111 1111 1111

本来应该输出32。

可以计算正数的中补码的个数,但无法计算-1(负数)补码中1的三个数,这可能就是我们代码中遇到的问题。

此时我们可以通过逻辑操作符来对我们的代码进行改善。

逻辑操作符&:在整型间进行与操作的过程是通过将十进制数转化为二进制数,然后进行按位与操作。(同为真时才为真)

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

如5&6  =   101&110  ———>101

                                              110

                                              100

输出结果为4。

我们可以利用这种思想来对代码进行改善,改善代码如下:

#include <stdio.h>
int main()
{
	int i=0;
	int count=0;
	int num=0;
	scanf("%d",&num);
	for(i=0;i<32;i++)
	{
		if(1==((num>>i)&1)) 
		count++;
	}
	printf("%d",count);
	return 0;
}

通过&逻辑操作后我们成功的实现了对负数的补码中的1计算。

由此可见我们掌握了逻辑操作符可以使我们的代码大大改善,有时甚至可以起到神奇的作用,所以我们应该对此熟练地掌握,由此来提高我们写代码的能力,加油! 

猜你喜欢

转载自blog.csdn.net/m0_59314318/article/details/125687391