株式会社マックグラフィックアーツ

MGAスタッフブログ - マックグラフィックアーツスタッフの不定期ブログ

0と1の世界を旅しよう! [10]

bit_02
ビット演算を使って、簡単な絞り込みをしてみようと思います。

【 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

のような感じで処理してあげると、フラグが立っているか高速に調べることができるみたいです。
 

某フラグが勃つ的なサイト見てるときに、人の気配を感じてウィンドウを瞬時に閉じるくらいの速さです。。。たぶん。
 

DEMO
 

慣れが必要になりますが、フラグを使うときにいろいろ応用もでき、覚えておくとビット役にたつと思います。