ビットの数え上げ

ハッカーのたのしみに載ってた。

x &= (x - 1)が凄いね。
これは、x-1でxが0以外だとxを下位ビットからみていって一番最初に1になってるビットが0になる。
それを元の値に対してかければその場所の位置だけを0にできる。
全部が0になるまで繰り返せば終了、この回数をカウントする。

function pop(x) {
    var n = 0;

    while (x != 0) {
	n += 1;
	x &= (x - 1);
	alert(x);
    }
    return n;
}

var x = 0xf;
alert(pop(x));