りょうのゲーム塾 -18ページ目

りょうのゲーム塾

再開、準備中。

眼科の検診を受けるために

月曜日に病院へ行ってきました。


薬のために目が見え辛くなるので

歩いて行くしかないので

天気も良いから散歩って事で。。。


その前に家のさくらんぼがほぼ満開になりました。


りょうのゲーム塾

りょうのゲーム塾

りょうのゲーム塾

どうですか?


確かに桜に比べると花付が良くはないけど

ほとんどがさくらんぼになるんですよ。


たぶん、今回もいっぱい小鳥が飛んできて

高いところのさくらんぼ食べちゃうんだろうなぁ~


今回は脚立出してできるだけ収穫するつもりです。


あ、少しは当然小鳥にもお裾分けしますよ。



りょうのゲーム塾

この花は庭に雑草のように咲く花です。


まだ、何の花か調べたこと無いので分かりませんが、

お隣の家ではプランタに咲いてるので

いざと言うときは聞けばいいか。。。



りょうのゲーム塾

りょうのゲーム塾

途中に小濱宿という宿場町だったところがあって

ここでは4月8日に小浜まつりというお祭りがあります。

その頃にはここも桜で満開になるはずですが。。。


なんか、少し開花が遅いような気がする。


この道の先にある病院の眼科に行っています。


検診が終わった後、ここを通り戻りますが

少し寄り道してこちらへ。。。


りょうのゲーム塾

首地蔵でぇ~す。


一応、首から上にご利益があるので

眼科に行った後は必ず立ち寄り

ロウソクとお線香をあげてきました。


後は少々お願いしてきましたけど。。。

ここではフラグ変数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)かを判定すれば十分です。

それでは数値変数をフラグ変数として扱う方法を説明します。
その前にフラグ処理の基本的なものは何でしたか?


1)フラグをONにする
2)フラグをOFFにする
3)フラグを判断する


数値変数をフラグ変数として使うとは変数の値を2進数で扱うという事です。
そうすることによりひとつの値を保持する変数の中に複数のフラグを作る事が出来ます。
ここでは説明をしやすいように数値変数FLAGの下位4ビットのみで説明します。

説明の中で次のような表記をします。


表記1) 変数名={変数の2進数値}


例:FLAG={0000}
ここでは変数FLAGの値の下4桁が0000である。
右の桁から0,1,2,3並んでいます。


表記2) 変数名[ビット番号]


例:FLAG[0]はフラグ変数FLAGの最下位ビットを意味します。
FLAG={0101}のとき
FLAG[0]=1
FLAG[1]=0
FLAG[2]=1
FLAG[3]=0
となります。


フラグ変数FLAGが存在するときFLAG[0]に対し
フラグの基本処理を行うには方法は次のようになります。


1)FLAG[0]をONにする


FLAG[0]=FLAG[0] OR 1


FLAG[0]の値は0か1のどちらかです。
すると論理和の表から。。。


A OR B = 結果
======================
0    0   0
0    1   1 ←1とのORなので
1    0   1
1    1   1 ←1とのORなので


この部分を抜き出すと。。。


A OR 1 = 結果
======================
0    1   1
1    1   1


要するに必ず1になります。


2)FLAG(0)をOFFにする


FLAG[0]=FLAG[0] AND 0


FLAG[0]の値は0か1のどちらかです。
すると論理積の表から。。。


A AND B = 結果
======================
0     0   0 ←0とのANDなので
0     1   0
1     0   0 ←0とのANDなので
1     1   1


この部分を抜き出すと。。。


A AND 0 = 結果
======================
0     0   0
1     0   0


要するに必ず0になります。


3)FLAG(0)を判断する


FLAG[0]=FLAG[0] AND 1


FLAG[0]の値は0か1のどちらかです。
すると論理積の表から。。。


A AND B = 結果
======================
0     0   0
0     1   0 ←1とのANDなので
1     0   0
1     1   1 ←1とのANDなので


この部分を抜き出すと。。。


A AND 1 = 結果
======================
0     1   0
1     1   1


要するに必ずフラグと同じ値になります。

ただし、なぜここではこんなことするのだろうと
疑問に思うかもしれません。

その理由とはフラグは1個だけでないからです。
次回は4ビット全部を操作してみましょう。