練習問題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;

こんな感じになってる。ループも分岐も無くできるんだなぁ。