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

Javaでビットベクトル(4)

Java

実際にビットベクトルを表現するクラスを定義してみます。
クラス名をビットベクトルとして、以下のように宣言します。

public class BitVector {
...
}

メンバにビットベクトルを持つことにするので、ビットベクトルの実体は以下のようにします。

private int mBitVector[];

今回は、4バイトの領域で管理することにしたので、int型にしましたが、long型の領域で管理しても良いです。

ビットベクトルのサイズを静的にし、コンストラクタによってインスタンスを生成する時にサイズを決定するとします。

なので、コンストラクタは、以下のようにします。

public BitVector( final long pMaxBitSize ) {
...
}

ここで、引数に指定するpMaxBitSizeは、ビットベクトルに格納できるビット数を表現しています。
long型の整数であるのは、4バイト=32個のビットを格納できる領域の配列(mBitVector[])なので、
配列の要素数はint型の最大値までしか指定できませんが、配列の各要素に32個のビットを格納できるため、ビットベクトルに格納できるビット数は、int型の最大値より大きくなるためです。

これらから実際のビットベクトルをコンストラクタで以下のように定義します。

public BitVector( final long pMaxBitSize ) {
		
	if ( 0 >= pMaxBitSize ) {
		// エラーとする。
		throw new MyProjectRuntimeException(new IllegalArgumentException());
	}
		
	// BitVectorを表現するWORD数
	long wordSize = (pMaxBitSize / WORD_BIT_SIZE) + 1;
		
	// intの範囲に収まっているか確認する。
	if ( ((long) Integer.MAX_VALUE) < wordSize ) {
		// BitVectorを表現するWORD数がintの最大値より大きくなった。
		throw new MyProjectRuntimeException(new IllegalArgumentException());
	}
		
	// 指定されたビットベクトルのサイズをWORD単位で確保する。
	this.mBitVector = new int [ (int) wordSize ];
	this.mWordSize = wordSize;
		
	// 確保したWORDで保持できるビット数の最大値を計算する。
	this.mBitSize = pMaxBitSize;
		
}

まず、pMaxBitSizeの条件として、0より大きいことを制約にしています。
MyProjectRuntimeExceptionは、ただの自作の例外クラスで、JavaのRuntimeExceptionを継承したラッパークラスです。
以下のようなクラスです。

public class MyProjectRuntimeException extends RuntimeException {

	/**
	 * デフォルトシリアルバージョンID
	 */
	private static final long serialVersionUID = 1L;
	
	MyProjectRuntimeException() {
		super();
	}
	
	MyProjectRuntimeException( final String pMessage ) {
		super( pMessage );
	}
	
	MyProjectRuntimeException( final String pMessage, Throwable pCause ) {
		super( pMessage, pCause );
	}
	
	MyProjectRuntimeException( Throwable pCause ) {
		super( pCause );
	}

}

RuntimeExceptionは、実行時例外というものです。チェック例外でないのは、クライアントからの利用時にこの例外をクライアントが適切に処理する必要がないからです。
クライアントからの利用ミスでない限り、この例外は発生しません。

次に、wordSizeを計算しています。
wordSizeは、mBitVectorのWORD単位での要素数のことです。
つまり、pMaxBitSizeを満たすために必要なint型の要素数のことです。
ここで、WORD_BIT_SIZEは、WORDに格納できるビット数なので、int型であれば32となります。
(WORD_BIT_SIZEは、スタティック宣言された定数です。)

次に、wordSizeがint型の最大値を超えないか調べ、超えていたらエラーとします。
wordSizeは、配列の要素数なので、int型の最大値を超えることはできません。

最終的に、pMaxBitSizeを格納できるだけのBitVectorの領域を確保し、確保したWORD数と格納できるBit数をメンバに保持するようにします。

これで、ビットベクトルの領域を確保することができました。
次回は、実際に値を設定するメソッドを作ってみようと思います。