http://www.mwsoft.jp/programming/java/java_lang_integer_bit_count.html
i = i - ((i >>> 1) & 0x55555555); i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); i = (i + (i >>> 4)) & 0x0f0f0f0f; i = i + (i >>> 8); i = i + (i >>> 16); return i & 0x3f;
理由はよくわからないが、2ビットの数から上位ビットが1なら1引くと、なぜか1であるビット数が求まる。具体例は以下。
数えたい数 → 計算 → 1であるビットの数 00 → 00 - 0 → 00 01 → 01 - 0 → 01 10 → 10 - 1 → 01 11 → 11 - 1 → 10
これを2ビットごとにデータを区切って、一気にやっているのが最初の行。
その後、2ビットごとを集計して4ビットにし、4ビットを集計して8ビットにし、8ビットを集計して16ビットにし、16ビットを集計して32bit全体のビット数カウントにする。
ちなみに「>>>」は「符号なし右シフト」の演算子である。