第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の列挙型は数値ではないため、ビットフラグを使えません。
そこで、それに置き換わるテクニックを紹介します。