論理積
今回のマジカルボックスでは直接は使用していないのですが、論理和とペアで覚えておきましょう。こんどは2進数でのかけ算です。
1) 0×0= 2) 0×1= 3) 1×0= 4) 1×1=
普通の計算では、1)から3)までは0、4)だけが1ですね。論理積でも同じです。論理積は英語ではANDと表現されます。さきのORが「演算する値のどちらかが1であれば結果は1」であったのに対し、論理積は「演算する値が両方とも1(1かつ(AND)1)のときだけ1」になります。
普通のかけ算と論理積は、複数桁の演算をすると顕著に違いがわかります。たとえば
0011×0010=
は、いくつになるでしょうか。十進数では3×2ですから、通常の計算では答は6、つまり0110です。論理積では、それぞれ桁ごとに計算をします。すると図6のようになります。
ということで、答は0010(2)です。
論理和(OR)では、任意のビットを1にするのに利用すると述べましたが、論理積(AND)はその逆で、任意のビットを0にするのに使用します。
再度図5を例に説明します。いま、いくつかのLEDが点灯しているとします。この中でD7だけ消灯させたい、つまりb7だけを0にしたい場合、b7の位置だけ0の値とAND演算することで実現できるのです。C言語では論理積は演算子に&を以下のように書きます。
Px = Px & 127 ; /* 127 は 0111 1111 */
演算する値の桁が1の部分、つまりb6~b0は、Pxの各ビットがもともと0であれば0&1=0で変化しません。もともと1であった場合も、1&1=1で変化しません。演算する値の桁が0の部分、つまりb7だけが、元の値が1であろうと0であろうと、0との論理積となって必ず0になるわけです。
マスク
組込みソフトでは、このように論理積演算を使って特定の桁だけ情報を保存して、それ以外をクリアする行為を「マスクをかける」と言います。説明した例のようなハードウェア制御に限らず、たとえば8で割った余りを求めたいとき(タブを含んだカーソル位置を求める処理などでよく登場します)、変数&7というふうに、対象変数の下位3ビットだけを「マスク」して取りだしてやることで、きわめてシンプルに実現することができます。
次回は
変数と演算子の説明は以上です。今回は演習作業なしでしたので、少々退屈でしたでしょうか。次回は、シミュレータを使って、今回の動作を目で見て確かめてみます。それではまた。