栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

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

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

#include 
int main()
{

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

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

本来应该输出32。

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

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

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

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

                                              110

                                              100

输出结果为4。

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

#include 
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计算。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1008806.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号