第9回 ビットフラグ
今回は「ビットフラグ」についてです。
「ビットフラグ」とは、整数型の各ビットを フラグに見立てて値を保持する方法です。
int型なら32bitですから、32個のフラグ(ブール値)を保持できます。
以下にサンプルを挙げますが、answerList 変数1つで 3つの入力した値を保持していること、 また、値定数を2の累乗で設定していることに注目してください。
フラグを立てるときはOR(|)演算を使用します。
フラグが立っているかチェックを行うときはAND(&)の結果を0と比較します。
public class BitFlgTest1 {
public static final int Q001 = (int)Math.pow(2, 0); // 00000000
public static final int Q002 = (int)Math.pow(2, 1); // 00000001
public static final int Q003 = (int)Math.pow(2, 2); // 00000010
public static void main(String[] args) {
int answerList = 0;
try {
// Q001
{
// 入力待ち
System.out.print("Q01:ステーキは好きですか? (Y/N) > ");
char c = input();
// フラグを立てる
if (c == 'Y') {
answerList = answerList | Q001;
}
}
// Q002
{
// 入力待ち
System.out.print("Q02:焼き鳥は好きですか? (Y/N) > ");
char c = input();
// フラグを立てる
if (c == 'Y') {
answerList = answerList | Q002;
}
}
// Q003
{
// 入力待ち
System.out.print("Q03:豚カツは好きですか? (Y/N) > ");
char c = input();
// フラグを立てる
if (c == 'Y') {
answerList = answerList | Q003;
}
}
System.out.println();
System.out.println("あなたの解答は....");
System.out.print("Q01:ステーキは好きですか? (Y/N) > ");
System.out.println((answerList & Q001) > 0?"Y":"N");
System.out.print("Q02:焼き鳥は好きですか? (Y/N) > ");
System.out.println((answerList & Q002) > 0?"Y":"N");
System.out.print("Q03:豚カツは好きですか? (Y/N) > ");
System.out.println((answerList & Q003) > 0?"Y":"N");
System.out.println("です。");
} catch (Exception e) {
e.printStackTrace();
}
}
private static synchronized char input() {
char c = 0;
try {
do {
c = (char)System.in.read();
} while (c != 'Y' && c != 'N');
} catch (IOException e) {
e.printStackTrace();
}
return c;
}
}
次回は、Java5の列挙型(enum)を使用します。
Java5の列挙型は数値ではないため、ビットフラグを使えません。
そこで、それに置き換わるテクニックを紹介します。

