EeBlog(テクニカルブログ)

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