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:上述内容来自编程之美,本人还没有这么厉害能够想到第三种解法。

  • 相关阅读:
    The while statement
    App server 与 Web server之间的区别
    Keyboard input
    Recursion
    Conditionals
    TurtleWorld Exercises
    Python TurtleWorld configuration and simple test
    Why functions
    The python programing language
    性能测试3 方法
  • 原文地址:https://www.cnblogs.com/un4sure/p/2382252.html
Copyright © 2011-2022 走看看