求一个整数存储在内存中的二进制中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

相关文章
|
29天前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
124 52
|
24天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
42 6
|
2月前
|
机器学习/深度学习 算法 物联网
大模型进阶微调篇(一):以定制化3B模型为例,各种微调方法对比-选LoRA还是PPO,所需显存内存资源为多少?
本文介绍了两种大模型微调方法——LoRA(低秩适应)和PPO(近端策略优化)。LoRA通过引入低秩矩阵微调部分权重,适合资源受限环境,具有资源节省和训练速度快的优势,适用于监督学习和简单交互场景。PPO基于策略优化,适合需要用户交互反馈的场景,能够适应复杂反馈并动态调整策略,适用于强化学习和复杂用户交互。文章还对比了两者的资源消耗和适用数据规模,帮助读者根据具体需求选择最合适的微调策略。
422 5
|
2月前
|
缓存 监控 Java
在使用 Glide 加载 Gif 动画时避免内存泄漏的方法
【10月更文挑战第20天】在使用 Glide 加载 Gif 动画时,避免内存泄漏是非常重要的。通过及时取消加载请求、正确处理生命周期、使用弱引用、清理缓存和避免重复加载等方法,可以有效地避免内存泄漏问题。同时,定期进行监控和检测,确保应用的性能和稳定性。需要在实际开发中不断积累经验,根据具体情况灵活运用这些方法,以保障应用的良好运行。
|
2月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
104 1
|
2月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
28天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
232 1
|
18天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
27天前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80