写点什么

位运算小妙招 - 求二进制序列中 1 的个数

作者:芒果酱
  • 2022 年 5 月 11 日
  • 本文字数:1182 字

    阅读完需:约 4 分钟


题目要求

🥩输入一个正整数 N,求二进制序列补码中所含 1 的个数

解法 1

🍲 类似于得到十进制数的每一位


🥫相同的道理,如果我们想知道二进制序列有多少个 1,只需要让正整数 N 不断 %2 进行判断,使用计数器,统计 1 的个数,当 N 为 0 时,跳出循环


🍇代码如下


size_t count_bit_one(int n){    size_t count = 0;    while(n)    {        if(n%2 == 1)        {            count++;        }        n = n/2;    }    return count;}
复制代码




🍤改进: 当我们输入的是负数时,结果会出错,因为整数在内存中以补码形式存储,所以我们可以把参数定义为无符号整数(size_t  即 unsigned int) ,这样传参为负数时也不会出错


size_t count_bit_one(size_t n){    size_t count = 0;    while(n)    {        if(n%2 == 1)        {           count++;        }        n = n/2;    }    return count;}
复制代码

解法 2

🥂想办法得到二进制序列中的每一位,这样就要使用到位运算的知识了。


🥨按位与运算 & :    0&1 = 0 1&1 = 1    所以我们可以让二进制序列的每一位和 1 进行与运算,如果对于的二进制序列的位为 1,那么结果就是 1,反之则是 0.




🍷那么我们怎么得到二进制序列中的每一位呢?这里就需要用到右移的知识点了.


右移得到每一位的二进制比特位之后,与 1 相与进行判断。使用计数器进行计数,如果相与的结果为 1,计数器+1


🍮右移:移动的是比特位.





🍼代码如下


size_t count_bit_one(int n){    int i = 0;    size_t count = 0;    for (i = 0; i < 32; i++)    {        //n不断右移,对应的二进制位和1相与进行判断,共进行32次        if (((n >> i) & 1) == 1)        {            count++;        }    }    return count;}int main(){    int n = 0;    scanf("%d", &n);    size_t count = count_bit_one(n);    printf("%d的二进制序列的1的个数为:%u\n", n,count);  return 0;}
复制代码

解法 3

🍪此处我们要知道 n&(n-1)代表什么含义


🥈n&(n-1) :去掉二进制序列中最低位的 1


👢只要知道进行了多少次 n&(n-1)运算就知道二进制序列有多少个 1







⚽代码如下


size_t count_bit_one(int n){    size_t count = 0;    while(n)    {        n = n&(n-1);        count++;    }    return count;}
复制代码

总结

🥼x|(x+1) : 把二进制序列中最低位的 0 变成 1 可以用此方法统计二进制序列中 0 的个数,每使用一次,就把低位的 0 变成 1,最后为全 1 序列、只要统计通过几次使用,值变成-1,就知道二进制序列有多少个 0


👕当二进制序列全为 1 时(补码):代表的值为:-1


👔n&(n-1) : 去掉二进制序列中最低位的比特位 1 可以用此方法统计二进制序列中 1 的个数,每使用一次,就把低位的 1 变成 0,最后为全 0 序列,只要统计通过几次使用,值变成 0,就知道二进制序列有多少个 1




好了,今天就到这儿吧,欢迎大佬们点赞、收藏、评论呀!笔者水平有限,欢迎各位大佬批评指正!再次感谢!

发布于: 刚刚阅读数: 2
用户头像

芒果酱

关注

我们都在努力奔跑,我们都是追梦人! 2022.02.14 加入

个人宣言:功崇惟志,业广惟勤 个人简介: 0.在校大学生 1.CSDN:C/C++领域新星创作者 2.掘金LV3创作者 3.华为云开发者社区云享专家 4.阿里云开发者社区专家博主 5.InfoQ创作者

评论

发布
暂无评论
位运算小妙招-求二进制序列中1的个数_c++_芒果酱_InfoQ写作社区