ビット演算を使って、簡単な絞り込みをしてみようと思います。
【 ABCD, ABC, ABD, ACD, BCD, AB, AC, AD, BC, BD, CD, A, B, C, D 】の中から
A〜Dの4文字が含まれているか、絞り込んでいきます。
まず、2進数を使ってフラグを設定するところを考えてみます。
普段、私たちが使っている10進数は
1 → 10 → 100 → 1000 → … のように10の累乗ごとに桁が増えてきます。
それに対して2進数は
1 → 2 → 4 → 8 → … 2の累乗ごとに桁が増えてきます。
今回はA〜Dの4文字を比較するので、2進数は次のようになります。
0000 → 0 0001 → 1 0010 → 2 0011 → 3 0100 → 4 0101 → 5 0110 → 6 0111 → 7 1000 → 8 1001 → 9 1010 → 10 1011 → 11 1100 → 12 1101 → 13 1110 → 14 1111 → 15
ここで注目するのは赤字になっている部分です。
0001 → 1 0010 → 2 0100 → 4 1000 → 8
これらをフラグとして利用します。
どのように利用するかというと、
各フラグを以下のようにの設定して考えてみます。
Aのフラグ → 1000 Bのフラグ → 0100 Cのフラグ → 0010 Dのフラグ → 0001
次に例として、1010を見てみましょう。
Aのフラグ → 1000 → 1010と比較 → 1 なので、◯ Bのフラグ → 0100 → 1010と比較 → 0 なので、× Cのフラグ → 0010 → 1010と比較 → 1 なので、◯ Dのフラグ → 0001 → 1010と比較 → 0 なので、× 1010は、AとCはフラグが立っていて、BとDはフラグが立っていないとなります。
また、A〜Dのフラグを10進数に置き換えると以下のようになり、
A → 1000 → 8 B → 0100 → 4 C → 0010 → 2 D → 0001 → 1 AC → 1010 → 8 + 2 = 10 のフラグ値を持つと考えられます。
フラグが立っているか比較するのに、このフラグ値を使います。
ここまできたら、後はビット単位のANDをしてあげれば、出来上がりです。
ビット単位ANDは、ふたつの同じ長さのビットパターンを入力とし、同じ位置のビット毎に論理的ANDを行って同じ長さのビットパターンを出力する操作である。各ビット位置で、入力するふたつのビットがどちらも1であれば、出力ビットは 1 となる。
【 ABCD, ABC, ABD, ACD, BCD, AB, AC, AD, BC, BD, CD, A, B, C, D 】の中からACを探すには、ACのフラグ値とビット単位のANDを行います。
ACflag & [ABCD〜D]flags === ACflag
のような感じで処理してあげると、フラグが立っているか高速に調べることができるみたいです。
某フラグが勃つ的なサイト見てるときに、人の気配を感じてウィンドウを瞬時に閉じるくらいの速さです。。。たぶん。
慣れが必要になりますが、フラグを使うときにいろいろ応用もでき、覚えておくとビット役にたつと思います。