zoukankan      html  css  js  c++  java
  • 读书笔记:编程之美求二进制数中1的个数

    1.最先想到的办法是x对2求余,判断是否为零,不为零则最低位为1,x除以2,以此往复

    2.考虑到求余是2比较耗时,想到能否用位操作来处理,于是有了一下解法:x&0x01,如果为1,则最低位为1,x右移一位,以此往复

    3.位操作虽然比求余效率高,但上述两种解法的时间复杂度都是x的最高位为1的位数,即log2x,例如x为00100100,那么时间复杂度即为O(6),能否把时间复杂度将为只和1的个数相关呢?

     编程之美中作者给出了答案:

      

    int Count(BYTE v)
    {
      int num = 0;
      while(v)
      {v&=(v-1);
      num++;
      }
      return num;
    }

    为何上面的代码可以把时间复杂度降到只和v中1的个数有关?

    我们希望在一次操作之后v中的1的个数减少一个,如何做呢?

    先从最简单想起,如果2进制位中只含有1,那么v肯定是2的整数次幂,我们希望在一次操作之后把v变成0,可以这样做,v=v&(v-1)

    上述操作可以去掉v中最低位的1,而又不影响前面的位,这样就达到我们的目的了。


    ps:上述内容来自编程之美,本人还没有这么厉害能够想到第三种解法。

  • 相关阅读:
    Jquery尺寸
    Jquery 位置
    c#编码规范
    手机即时通信文章列表
    缺陷跟踪系统BugTracker。 以下对使用
    用正则表达式来匹配图片标签
    mvc 分页
    Asp.Net MVC4网站中自定义AuthorizeAttribute
    asp.net mvc4 身份验证问题无法绕过内置的Membership/Role机制
    HDU4712Hamming Distance随机化算法
  • 原文地址:https://www.cnblogs.com/un4sure/p/2382252.html
Copyright © 2011-2022 走看看