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