求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解)

简介: 求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解)

前言:Hello!大家好,我是@每天都要敲代码;今天就划水一篇;再给大家带来一道有趣的例题,我目前知道的有3种方法,今天将一一呈现给兄弟们;欢迎大家一起学习!!!


c3263df6a1e7497eb6af74d1b97dc5ad.jpg

方法1:暴力求解法

解析:


我们都知道数据在计算机中是以二进制码的形式存储的,无非就是0和1;比如数字15的二进制形式就是1111;我们怎样才能得到它有几个1呢?当然取出%2取出最后一位,与1进行比较;然后在c除2继续看一位,依次类推,直到最后结果为0就结束。


具体代码:


52b4958bc32e4749bd20bc87cb95903a.png

代码分析:

   我们来分析一下这个代码:


82d0b2f457a54ee3b53aac13356b7ec7.png


%2和/2其实就类似于%10和/10一个道理;这里我只提醒一点:就是我们把n定义为无符号整型unsigned int;为了就是这个代码也可以计算负数;


   例如:n=-1如果是有符合数n % 2 == -1不满足;然后n= n / 2 结果就为0了跳出循环;


   但是如果定义为无符号数呢?


   -1在计算机中存储是补码的形式存储的就是111111.......11(32个1);当做无符号数来看,原码和反码、补码都是一样的,所以原码也就是32个1,打印出来当然就不是0了!!!  


方法2:利用移位运算符>>

解析:


我使用的是VS2019(32位);方法2就是取出每一位与1相与;如果原来二进制位是0,得到的就是0;如果原来二进制位是1,得到的就是1,然后count++;那么我们不妨一下个循环,让n进行移位,从不移位到移31位结束,下面看具体代码:


具体代码:



115de71859dc41c8a8265d50668dc901.png

5de4ec90fe8f49a597f564b8608e3a12.png

方法3:(&)与运算

解析:


    方法3是这道题的最优解法,有多少个二进制1,实际上就循环了多少次!!!我个人感觉确实很难想出来,怎么处理呢?我们不是不断通过n = n&(n-1)进行操作的;原来说起来比较麻烦,我们不妨通过画图的形式去理解:


2b95bfc1368341cb803f892850aa2222.png



我们发现我们没执行一次n&(n-1)就会少一个1,所以它需要循环的次数是和n所用的1的个数是有关的,是三种方法最优的!!!


具体代码:


73532209e06548acb6644423b4e2acb6.png

总结:

     以上就是今天的内容,把这道题拿出来分析,我个人感觉是非常有必要的;我们首先是从最简单最容易的方法入手,然后发散思维,去寻找有没有更优的方法去解决,这样才会使我们慢慢成长;希望这个题目对你有所帮助;一起学习,共同进步!!!


3109d1e4e12b4d61853178067ee408c7.jpg

相关文章
|
1月前
|
弹性计算 定位技术 数据中心
阿里云服务器配置选择方法:付费类型、地域及CPU内存配置全解析
阿里云服务器怎么选?2025最新指南:就近选择地域,降低延迟;长期使用选包年包月,短期灵活选按量付费;企业选2核4G5M仅199元/年,个人选2核2G3M低至99元/年,高性价比爆款推荐,轻松上云。
139 11
|
4月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1614 0
|
4月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
468 1
|
10月前
|
存储 安全 iOS开发
内存卡怎么格式化?6个格式化方法供你选
随着使用时间的增加,内存卡可能会因为数据积累、兼容性或是文件系统损坏等原因需要进行格式化。那么怎样正确格式化内存卡呢?格式化内存卡的时候需要注意什么呢?本文会给大家提供详细的步骤,帮助大家轻松完成格式化内存卡的操作。
|
4月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
441 0
|
5月前
|
存储 Windows
内存卡坏了还能修吗?4种常见修复方法
内存卡出现“无法保存”或“存储异常”等问题时,不一定是硬件损坏,可能是系统错误或文件系统异常导致。本文介绍几种亲测有效的修复方法:1) 更换读卡设备排除接触问题;2) 格式化修复文件系统(需先备份数据);3) 使用DiskGenius检测坏道;4) 借助厂商工具深度修复。同时提供日常保养建议,如避免高温环境、养成数据备份习惯,延长内存卡使用寿命。通过这些方法,多数问题可轻松解决,无需更换硬件。
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
716 62
|
12月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
307 6
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
983 1

热门文章

最新文章