写点什么

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

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

    阅读完需:约 4 分钟

之前笔者已经写过了如何求二进制序列中 1 的个数,(具体大家可以翻看笔者之前的文章[:)](位运算小妙招-求二进制序列中1的个数 )


💎二进制以 1 和 0 表示,这次,笔者将讲解另一个小妙招快速求解二进制序列中 0 的个数!



题目要求:

🚗求一个二进制序列中二进制位为 0 的个数


如:15 二进制序列 0 的个数为 28



方法 1:%2 /2


🛺二进制:只有 0 和 1 所以我们可以求出二进制 1 的序列之后,相减


int:4 字节->32bit


二进制序列中 0 的个数 = 32 - 二进制序列 1 的个数


🛴%2 /2 判断条件不能写成 n%2 == 0 ->count++ 然后返回 count 的值 因为偶数才符合 n%2 == 0


🛵做法:求出二进制序列中 1 的个数之后,用 32-去二进制序列 1 的个数得到的就是二进制序列中 0 的个数


size_t Binary_zero(size_t n){    size_t count = 0;    while (n)    {        if (n % 2 == 1)        {            count++;        }        n = n / 2;    }    return 32 - count;}int main(){  int n = 0;  scanf("%d", &n);  size_t ret = Binary_zero(n);  printf("%d\n", ret);}
复制代码


🚎注意:当我们输入的是负数时,结果会出错,因为整数在内存中以补码形式存储,如果参数 n 定义为整形:负数时:会把补码->原码然后再参与下面的计算 0 的个数,这样就不符合要求! 所以我们可以把参数定义为无符号整数(size_t 即 unsigned int),这样传参为负数时也不会出错!


🏍size_t :无符号整数,把内存中的补码当成原码看待


🚠打印 16 进制时也是把内存中的补码当成原码看待



方法 2:得到每一位进行分别判断


🚇将二进制序列的每一个比特位分别判断


🚉**& : 0&1 = 0 1&1 = 1**


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


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


右移:移动的是比特位.


size_t Binary_zero(int n){  int i = 0;  size_t count = 0;  for (i = 0; i < 32; i++)  {    if ( ((n >> i) & 1) == 0)    {      count++;    }  }  return count;}int main(){  int n = 0;  scanf("%d", &n);  size_t ret = Binary_zero(n);  printf("%d\n", ret);}
复制代码



方法 3-小妙招:x|(x+1)

✈x|(x+1) : 把二进制序列中最低位的 0 变成 1


可以用此方法统计二进制序列中 0 的个数,每使用一次,就把内存中的最低位的 0 变成 1,最后为全 1 序列 ->补码为全 1 ->对应十进制值为-1


🚋只要统计通过几次使用,值变成-1,就知道二进制序列有多少个 0


所以判断条件为:🚀 while(n != -1)


size_t Binary_zero(int n){  size_t count = 0;  while (n != -1)  {    n = n | (n +1);    count++;  }  return count;}int main(){  int n = 0;  scanf("%d", &n);  size_t ret = Binary_zero(n);  printf("%d\n", ret);}
复制代码




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

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

芒果酱

关注

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

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

评论

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