ここではフラグ変数FLAGに4つのフラグがあるとします。
そして各フラグの状態は下記の通りと仮定しましょう。
FLAG[0]=1
FLAG[1]=0
FLAG[2]=1
FLAG[3]=1
するとフラグ変数の内容は FLAG={1101} です。
ここでFLAG[1]を1(ON)にしてみましょう。
前回の例でONにするためには1をORすれば良いわけです。
ここで論理演算は1ビットだけ演算するわけでなく
すべてのビットに等しく演算を行います。
1という値は2進数で(ただしここでは2進4桁で扱う){0001}です。
FLAG={1101} OR {0001}
となります。
ここで論理(ビット)演算は各ビット毎に演算を行います。
{1101}
{0001}
OR
{1101}
どうでしょうか?
FLAG[1]とは右から1桁目のビットですが、
1(ON)になっていません。
(注意:一番右端が0桁目になります)
ここで今までの内容をいくらか理解していた人は
そうじゃない事にきずきます。
ここで1といっている値はフラグのある位置のビットが
実は1でなければなりません。
ここでは右から1桁目のビットをONにしたいのだから
ORする値は右から1桁目が1の値になります。
要するに{0010}です。
{1101}←FLAGの内容
{0010}←フラグの位置を1にした値
OR
{1111}←右から2桁目が1(ON)になっている
では、今度は FLAG{1101} のとき右から2桁目を
0(OFF)にするにはどうしたらいいでしょうか?
右から2桁目を演算したいのですから {0100} になりますね。
そして0(OFF)にしたいのでANDする。。。え?
そうです。
フラグをOFFにする場合は0をANDしないといけません。
ですからOFFしたい位置のビットが0でそうでないビットは1にします。
{1101}←FLAGの内容
{1011}←フラグの位置を0にした値
AND
{1001}←右から2桁目が0(OFF)になっている
どうでしょうか?
右から2桁目だけ0(OFF)になりました。
演算により使う値が変わります。
ちなみにORの時に使った値をフラグビットと呼ぶ事にします。
それに対してANDに使った値をマスクビットと呼ぶ事にします。
フラグビットとマスクビットの関係は簡単で
例えば今回の場合演算するビット位置は2桁目で
フラグビットは2桁目が1になります。
{0100}
これをマスクビットにするには否定(NOT)を使えば
{0100}←フラグビット
NOT
{1011}←マスクビット
となります。
最後にフラグの判定をしてみましょう。
フラグ変数の値はFLAG{={1101}とします。
右から3桁目のビットを判定してみます。
右から3桁目ですからフラグビットは{1000}となります。
判定にはこのフラグビットをANDします。
{1101}←FLAGの内容
{1000}←フラグビット
AND
{1000}←0か1か判定できますか?
これって1じゃないですよね。
しかし0では無いのでOKです。
判定では0(OFF)か、そうでない(ON)かを判定すれば十分です。