練習問題9.2
立っているbitの数を取得する
public class CheckBit { public static int CheckBitCount(Integer n) { int Counter=0; for(int j=0;j<Integer.SIZE;j++){ Counter += (n & 1); n = n >>> 1; } return Counter; } public static void main(String[] args) { System.out.printf("%31sの1の数は:%d\n", Integer.toBinaryString(12),CheckBit.CheckBitCount(12)); System.out.printf("%31sの1の数は:%d\n", Integer.toBinaryString(Integer.MAX_VALUE),CheckBit.CheckBitCount(Integer.MAX_VALUE)); System.out.printf("%31sの1の数は:%d\n", Integer.toBinaryString(Integer.MIN_VALUE),CheckBit.CheckBitCount(Integer.MIN_VALUE)); } }
実行結果
1100の1の数は:2
1111111111111111111111111111111の1の数は:31
10000000000000000000000000000000の1の数は:1
公開されているアルゴリズムとの比較という事で、Integer.bitCountの実装を見てみた。
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;
こんな感じになってる。ループも分岐も無くできるんだなぁ。