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

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

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

目录

方法1:暴力求解法

解析:

具体代码:

代码分析: 

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

解析:

具体代码:

代码分析: 

方法3:(&)与运算

解析:

具体代码:

总结:


方法1:暴力求解法

解析:

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

具体代码:

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

代码分析: 

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

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

     %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位结束,下面看具体代码:

具体代码:

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

代码分析: 

     其实我感觉方法2和方法1的思路是类似的,方法1是一位一位取出来,没取出来一位/2让n不断变小,本质上改变了n的值;而方法2直接通过控制移多少位来让n不断变小,本质上并没有改变n的值。下面看具体分析:

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

方法3:(&)与运算

解析:

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

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

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

具体代码:

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

 

总结:

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

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128542.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!