bit数え上げ2

d:id:tkuro:20061129
しつこく食い下がるような問題でもないんだけど、、、
x & (x-1) が 一番右の1のビットをカットすることを利用して、

int enum_bit(unsigned long x)
{
        int counter = 0;

        while( x ) {
                counter++;
                x &= x-1;
        }
        return counter;
}

うーむ。おくがふくぅぁい。

.L16:
        leal    -1(%edx), %eax
        incl    %esi
        andl    %eax, %edx
        jne     .L16

1であるビットが少ない場合激速ですが、all 1 = 0xffffffff でも164clkでした。。。