位运算小妙招 - 求二进制序列中 1 的个数
题目要求
🥩输入一个正整数 N,求二进制序列补码中所含 1 的个数
解法 1
🍲 类似于得到十进制数的每一位
🥫相同的道理,如果我们想知道二进制序列有多少个 1,只需要让正整数 N 不断 %2 进行判断,使用计数器,统计 1 的个数,当 N 为 0 时,跳出循环
🍇代码如下
🍤改进: 当我们输入的是负数时,结果会出错,因为整数在内存中以补码形式存储,所以我们可以把参数定义为无符号整数(size_t 即 unsigned int) ,这样传参为负数时也不会出错
解法 2
🥂想办法得到二进制序列中的每一位,这样就要使用到位运算的知识了。
🥨按位与运算 & : 0&1 = 0 1&1 = 1 所以我们可以让二进制序列的每一位和 1 进行与运算,如果对于的二进制序列的位为 1,那么结果就是 1,反之则是 0.
🍷那么我们怎么得到二进制序列中的每一位呢?这里就需要用到右移的知识点了.
右移得到每一位的二进制比特位之后,与 1 相与进行判断。使用计数器进行计数,如果相与的结果为 1,计数器+1
🍮右移:移动的是比特位.
🍼代码如下
解法 3
🍪此处我们要知道 n&(n-1)代表什么含义
🥈n&(n-1) :去掉二进制序列中最低位的 1
👢只要知道进行了多少次 n&(n-1)运算就知道二进制序列有多少个 1
⚽代码如下
总结
🥼x|(x+1) : 把二进制序列中最低位的 0 变成 1 可以用此方法统计二进制序列中 0 的个数,每使用一次,就把低位的 0 变成 1,最后为全 1 序列、只要统计通过几次使用,值变成-1,就知道二进制序列有多少个 0
👕当二进制序列全为 1 时(补码):代表的值为:-1
👔n&(n-1) : 去掉二进制序列中最低位的比特位 1 可以用此方法统计二进制序列中 1 的个数,每使用一次,就把低位的 1 变成 0,最后为全 0 序列,只要统计通过几次使用,值变成 0,就知道二进制序列有多少个 1
好了,今天就到这儿吧,欢迎大佬们点赞、收藏、评论呀!笔者水平有限,欢迎各位大佬批评指正!再次感谢!
版权声明: 本文为 InfoQ 作者【芒果酱】的原创文章。
原文链接:【http://xie.infoq.cn/article/9266d45ea2802ddadbe6d8731】。文章转载请联系作者。
评论