前言:Hello!大家好,我是@每天都要敲代码;今天就划水一篇;再给大家带来一道有趣的例题,我目前知道的有3种方法,今天将一一呈现给兄弟们;欢迎大家一起学习!!!
目录
方法1:暴力求解法
解析:
我们都知道数据在计算机中是以二进制码的形式存储的,无非就是0和1;比如数字15的二进制形式就是1111;我们怎样才能得到它有几个1呢?当然取出%2取出最后一位,与1进行比较;然后在c除2继续看一位,依次类推,直到最后结果为0就结束。
具体代码:
代码分析:
我们来分析一下这个代码:
%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位结束,下面看具体代码:
具体代码:
代码分析:
其实我感觉方法2和方法1的思路是类似的,方法1是一位一位取出来,没取出来一位/2让n不断变小,本质上改变了n的值;而方法2直接通过控制移多少位来让n不断变小,本质上并没有改变n的值。下面看具体分析:
方法3:(&)与运算
解析:
方法3是这道题的最优解法,有多少个二进制1,实际上就循环了多少次!!!我个人感觉确实很难想出来,怎么处理呢?我们不是不断通过n = n&(n-1)进行操作的;原来说起来比较麻烦,我们不妨通过画图的形式去理解:
我们发现我们没执行一次n&(n-1)就会少一个1,所以它需要循环的次数是和n所用的1的个数是有关的,是三种方法最优的!!!
具体代码:
总结:
以上就是今天的内容,把这道题拿出来分析,我个人感觉是非常有必要的;我们首先是从最简单最容易的方法入手,然后发散思维,去寻找有没有更优的方法去解决,这样才会使我们慢慢成长;希望这个题目对你有所帮助;一起学习,共同进步!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128542.html