读书笔记:编程之美求二进制数中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:上述内容来自编程之美,本人还没有这么厉害能够想到第三种解法。

原文地址:https://www.cnblogs.com/un4sure/p/2382252.html