■
Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング
を読んでいて、BitSet.valueOfの使い方が良くわからなかったので調べた(正確には知ってる人に質問した)
上記書籍の良くわからなかった箇所は下記の部分
BitSet.valueOf(bytes).get(n) == ((bytes[n/8]) & (1<<(n%8))) !=0)
byte[] bytes = {(byte) 0b10101100, (byte) 0b00101000}
BitSet prime = BitSet.valueOf(bytes)
// {2, 3, 5, 7, 11, 13}
一体何がどーなって2, 3, 5, 7, 11, 13なんて数字が出てきたんだ…
valueOf
public static BitSet valueOf(byte[] bytes)
より正確には、
すべての n < 8 * bytes.length
に対してBitSet.valueOf(bytes).get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)
となります。
このメソッドは、BitSet.valueOf(ByteBuffer.wrap(bytes))
と同等です。
一見ややこしいが、javadocの定義によると
1 0 (n / 8)
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 (n%8)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ( n )
0 0 1 0 1 0 0 0 | 1 0 1 0 1 1 0 0
n = 2の場合
1 = 00000001をn%8だけ左シフトすると00000100
byte[0] = 10101100
つまりこれらのビットのANDは
00000100
10101100
------------
00000100 != 00000000 (0)
BitSet.valueOf(bytes).get(2) == true
となり、2ビット目が立っていることが分かる。
単に、byte配列の値をベースにBitSetを初期化しているだけなんですね。