Hello,各位热爱编程的铁铁们,最近学习得怎么样了啊?我最近也是学到了二进制这一模块了。该说不说,二进制这一块确实比之前学习的内容要难一点。我也是又遇到一个问题,就是如何求取一个数中二进制位中1的个数,一开始我也是真的很头疼,不过皇天不负有心人,在一番沉淀之后,我也是成功地解决了这个问题,就让我来和大家分享一下这类问题的一些相关解法吧!
我给大家一共整理了3种解法。
方法一:
相必大家一定知道按位与——&,这个操作符吧。这个操作符的使用规则是:a&b,相同的二进制位有0则为0,两个数都是1则为1.那么当我用任意一个数&(按位与)上1,从第一位到第32位,如果&1的结果是1的话,那么说明当前这一位就是1,然后再用 >>(右移操作符将32位逐一测试)。
此方法可应用于全体整数。
方法二:



由上图可知,我们的主要过程是进行了一个先 %2 再 /2 的操作。相比于我们日常生活中的10进制,我们想得到一个数的每一位(如上图n=135),我们是先 %10 得到个位,然后 n = n /10;之后再 %10 得到十位,n = n / 10;最后再 %10得到百位。那么相比较与计算机的存储,我们所存储的是二进制的补码,所以我们就需要进行如上图(n=13),我们先 %2得到32位中的第一位,如果得到的是1,就说明这一位就是1,然后 n = n / 2;接着再 %2,得到第二位,再 n = n /2;反复进行此操作,直到 n的值变为0为止。
但是这种方法,虽然好理解一点,但是却只能应用于0和正整数,不能应用于负整数。
方法三:


前面我们已经讲述过按位与(&)操作符的用法:有0为0,两个数都是1则为1。如上图,我们依旧假设 n = 13(此时我只写了二进制的最后四位),只要 n & (n-1) != 0,就说明二进制位上有1。
此方法可应用于全体整数,还可用于判断一个数是否为2的倍数,具体后续为大家讲解。
到最后,关于如何求一个数二进制位中1的个数的三种方法我已经为大家讲解完毕了,我也是觉得各有千秋啊,在自己编程完再给大家讲解完之后,我也觉得自己的功力有了进一步增长,但是我仍然觉得我又讲解不足的地方,还请大家谅解。如果大家还有任何疑问,欢迎留下你们宝贵的言论,谢谢啦!

被折叠的 条评论
为什么被折叠?



