読者です 読者をやめる 読者になる 読者になる

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を初期化しているだけなんですね。