其实 5楼 的分析抓住了要点。这个函数就是返回 x 中为 1 的比特位的个数。
只不过 5楼 分析的好像抽像了点,这个函数的工作原理其实只要能说明下面这个事实就行了:
x = x&(X-1) 这个操作,会使 x 中为 1 的比特位数减少一。
这很好说明。
如果 x 的最末一位是 1,即 x 是形如 aaaaaaa1 这样一个数,a 不是 0 就是 1,我们不关心。那么 x - 1 则是 aaaaaaa0。
大家都知道:0&0 = 0, 1&1 = 1,1&0 = 0。所以与完了肯定是 aaaaaaa0,这个数和 x 比前面全一样,就是最后一位的 1 没了。所以它含有的 1的位数比 x 少一。
如果 x 的最末位不是1,那么 x 肯定是形如 aaaaaaa0 这样的一个数,如果 a 全是 0,那么 while 循环就退出了。假设最右面的一个不为0的a是倒数第二个a。(是其它的位也不要紧,我们此处只关心最右边的那个是1的位,其它的不关心)
那么 x 即是 aaaaa100,于是 x-1 则是 aaaaa011。与一下很明显的結果是 aaaaa000。还是会抹去 一个1.
现在結果很清楚了,其实 x&(x-1) 就是将
x中的
最低的一个为1的位
置0。
count 就是在数这件事一共干了几回。如果干了3回 x 就变成 0 了,就说明 x 里一共有三个为1的位。
9999 的二进制写法是 10011100001111 一共8个1。
[
本帖最后由 pangding 于 2011-4-25 15:00 编辑 ]