2章 論理演算 <基本情報処理試験>

2018/ 1/ 19 五十川 晶一

1 論理演算の種類

 

1-1 3種類の演算

前項のシフト演算に続いて、今項では論理演算について取り扱います。
論理演算とは真(True)か偽(false)を判断できる文のことです。
この真偽を真理値、または真偽値、論理値などと呼びます。

基本的な論理演算には、AND演算NOT演算OR演算の3種類が存在します。
演算の意味は次のようになります。

 A AND B …… Aが真 かつBが真 なら 真

 A OR B   …… Aが真 もしくはBが真 なら 真

 NOT A  …… Aが真 じゃない なら 真

 

 

1-2 真理値表

論理演算の結果を表にまとめたものを真理値表と呼びます。
以下はA、Bをなんらかの条件とした真理値表です。

真理値表そのものを丸暗記する必要はありませんが、
それぞれの演算結果がどうなるかをしっかり覚えておきましょう。

 

1-3 NOTとXの演算

NOT演算が反対の値を返す演算であることは理解しましたか?
このNOT演算と、AND・OR演算を組み合わせる事が出来ます。
それぞれ、NAND演算NOR演算と呼びます。(NはNOTの頭文字)
演算結果をNOT演算(反対に)するものだと覚えてください。

また、OR演算にはXOR演算という派生があります。(XはExclusiveの略)
この演算はどちらか一方が真である場合のみ真を返します。
イメージしにくいですが、極端になったOR演算だと考えましょう。

まとめると、以下のようになります。

A NAND B …… Aが真 かつ Bが真 なら

A NOR B …… Aが真 もしくは Bが真 なら

A XOR B …… Aが真 もしくは Bが真、両方とも真でないとき なら真

真理値表で表すと以下の通りです。

 

さて、論理演算はビット演算に使用されます。
下は、ABそれぞれに1か0を入力した場合の、論理演算の真理値表です。

何の演算をすれば何が出力されるのか、原理は先ほど説明した通りです。
後のマスク処理等でよく使うので、覚えておいてください。

 

1-4 論理式

さて、論理演算を複数使った式を論理式と呼びます。
例えば、こんな式です。

  A OR B AND C

どこから演算しますか?A OR Bですか?それともB AND C?
仮に上の式が下のようだったら、順番では悩まないと思います。

  A + B × C

乗算が加算より優先されるので、B × Cを行った後にAを足す事になります。
さて……こんな風に、四則演算には優先順位が存在しますよね。
そして、実は論理演算にも優先順位があるんです。
左側から優先順位が高い順に並んでいます。

  NOT > AND > OR

先ほどの例に戻りましょう。
優先順位の高いB AND Cから計算を行います。
論理演算後、AとAND演算結果をOR演算するのが正解です。
この論理式は、後ほども例に使いますので、もう少し覚えていてください。

ここまでは各論理演算について説明してきました。
これからの項目全ての基礎となってくるので、
まずはここまでの内容を復習してみてください。

 

 

 

2 ○○で見る論理演算

 

2-1 表記で見る論理演算

まずは、各演算が文章上に出てきたときの表記方法を学習します。
表記上とは、すなわち文中に出てくる文章のことです。

また、数学的な記号として、AND演算には(キャップ)、
OR演算には(カップ)が用いられることがあります。
NOT演算は演算記号と同じく(バー)を上につけてAと書きます。
特に∩と∪は間違えやすいので、注意してください。

例: A AND B 、 AとBの論理積 、 A ・ B 、 A ∩ B

上の論理演算は、まったく同じ意味を表しています。
1つ覚えればいい、ではなく、どれも(文中に)出る可能性があるので、
流し見せずになんとか覚えてください。

 

2-2 ベン図で見る論理演算

数学には集合を視覚的に表したベン図というものがあります。

このベン図によって、論理演算を表すことができます。
論理演算をそれぞれベン図で表すとどうなるか、見てみましょう。
以降、対象が示す範囲をピンクで塗りつぶしています。

・NOT関数比較

左がA、右がNOT A

・AND関数比較

左がA AND B、右がA NAND B
 

・OR関数比較

左がA OR B、右がA NOR B

下がA XOR B

真偽値表の中身が、図になるとこうなると考えてください。

今度は、論理式をベン図に表します。
問題は前に例として使った、A OR B AND Cを図式しましょう。

問題 A OR B AND C

デフォルト

①まずは、優先順位の高いB AND Cを行います。

B AND C

②次に、その結果とAをOR演算します。

A OR B AND C

③上のピンクの範囲がA OR B AND Cの演算結果です。

先にA OR Bを行うと全く違う結果になってしまうので、
最初に学んだ優先順位をよく思い出しましょう。

ベン図自体は論理演算の理解に使えますが、
それよりも試験問題としてよく出題されます

 

2-3 フローチャートで見る論理演算

今度は、フローチャートで論理演算を見てみましょう。
フローチャートとは、プログラム全般で使われる処理の流れ図です。
使われる記号は主に以下の通りです。


基本的に上から下に流れていきます。

処理が順番に進むことを順次と呼びます。
その順次と分岐、繰り返しの3つが大まかな流れの分類です。

では具体的に、分岐や繰り返しの条件分に論理式を入れてみましょう。
図記号に入れる文字にルールはないので、英語(ANDなど)から
日本語(かつ、など)まで色々と入ります。
下図は、その一例です。

・分岐の例

この場合、「A>0 AND B>0」が真ならYESに、
NOなら右のNOに飛びます。

・繰り返しの例

この場合、「A>0 OR B>0」が真である限り、
ループを繰り返します。

今は「そんな風に図にするのか」と覚えておいてください。
後のアルゴリズムの章で、流れを図式化する際に使います。
「なんだっけこの記号……」となった時は、ここで学んだ事を
見返してみてください。

 

2-4 ド・モルガンと見る論理演算

最後の○○はド・モルガンという数学者の名前が入ります。
数学者にはよくある事で、自分の名前を法則名につけました。
という事で、ド・モルガンの法則について見ていきましょう。

A AND B

ある論理式があります。意味は「AかつB、でない」ですが、
この法則を当てはめると、同じ意味を持ちながら別の式に変更できます。

A AND B = A OR B

「AかつB、でない」を「Aではない、または、Bでない」に変えました。
意味は変わらずに、記述の方法だけが変わったのです。
また、同様の法則で以下の変更もできます。

A OR B = A AND B

「AまたはB、ではない」を「Aでなく、かつ、Bでない」に変えました。

例えばフローチャートの条件分岐は、なるべくシンプルな方が良いですよね。
この法則を知っていると、条件次第で簡略化が出来るかもしれません。
計算過程の省略(変更)方法として、ぜひ頭に入れてください。

 

 

 

3 論理演算のマスク処理

 

3-1 論理演算によるマスク

論理演算の使い方には、データを部分的に変化、取り出す手法があります。
これをマスク処理と呼びます。
1ビット毎に元のデータとマスクのデータを論理演算する手法です。
ここでは、8ビットのデータ01010110とマスク用のデータ00001111を例に、
それぞれの演算でどうなるかを見ていきます。

・AND演算のマスク

マスクのビットが0の場合、その部分は0に変化します。
マスクのビットが1の場合、その部分は変化しません。
特定の値を0にするとき、または特定の値を取り出す時に使います。

・OR演算のマスク

マスクのビットが0の場合、その部分は変化しません。
マスクのビットが1の場合、その部分は1に変化します。
一定の範囲を1にしたい場合に用いられるマスクです。

・XOR演算のマスク

マスクのビットが0の場合、その部分は変化しません。
マスクのビットが1の場合、その部分の値が反転します
特定範囲を反転したい場合に用いることができるほか、
11111111をマスクする事で全範囲を反転することができます。
全範囲の反転はNOT演算でも可能ですが、
部分的な反転はXOR演算のマスク処理でしか行えません。

今までの目的、マスクパターンを纏めると、以下の表になります。

ORとXORのマスクの違いに注意してください。

 

3-2 マスクの使用例

使い方がわかったところで、使用例を見てみましょう。
以下は過去に試験に出た問題です。 (H27 春 問1より引用)

複雑な問題ですが、まずは手順通りやってみましょう。
問題文にある通り、ここは00101000をベースに解いていきます。

手順1では、ビット列A=00101000から1引いたビット列Bを作成しています。
というわけで、ビット列B=00100111とします。

手順2では、先ほどのビット列AとBをXOR演算しています。
XOR演算のマスクは覚えていますか?
マスクが0の場合そのままの値を、1の場合は逆の値になります。

よって、ビット列C=00001111になります。

さて、手順3でようやく今回の本題に入ります。
ビット列Aとビット列Cで何等かの論理演算をして、00001000を出します。

マスク=ビット列Cが0の場合に0、1の場合は値が変化していませんね。
以前の図を覚えていますか?答えは……そう、AND演算になります。
このように、複数の論理演算とビットを関連付けた問題が出てきます。

 

3-3 目的のビットを得る

先ほどの説明にもありましたが、AND演算で目的のビットを取り出す
ことができます。例えば、先ほどの例だと……

00101000 AND 00001111 = 00001000

下位4ビットを1にマスクする事で、そのまま下位ビットを得る事ができます。
ちなみに、上位ビットを得たい場合は逆のことを行います。

00101000 AND 11110000 = 00100000

上位4ビットを1にマスクして、上位4ビットを得る事ができました。

また、シフト演算と組み合わせる事ができます。
(そして、そういう問題も試験に出ます)
同じマスクを使いまわす場合は、以下の手順を行います。
以下はその一例です。

例) ビット列01101100を4ビットずつ分ける。

ここでは、2つの変数①と②に入れることにします。

手順1 ビット列と00001111をAND演算
    01101100 AND 00001111 = 00001100

手順2 演算結果を変数①に入れる

手順3 ビット列を4ビット右に論理シフト
    01101100 >> 4 …… 00000110

手順4 シフト結果を変数②に入れる

8ビットの場合だと恩恵を薄く感じてしまうかもですが、
対象が16ビット等になってくると、シフト演算を使った手順は
繰り返しに向いており、処理が非常に楽になります。

マスク処理は、論理演算の有用な使用方法の一つです。
次のネットワークでは、早速ビットをマスクする実例が出てきます。
他にはどこにどう使われているのか、是非関心を持ってみてください。

 

 

 

4 コンピュータの中の論理演算

 

4-1 論理回路とMIL記号

今までは論理演算という法則と、その応用について学んできました。
この章では打って変わって、コンピュータの中身について説明していきます。
まず、コンピュータ内部には論理演算用の論理回路という回路があります。
それを人が見るために図式したものがMIL記号と呼ばれるものです。

フローチャートと違うの?と思われるかもしれませんが、あちらは
あくまでプログラムの処理の流れ図であり、こちらは回路図です。
まずは、下の図をご覧ください。

まずはイメージです。左から入力データが入ってきて、
中心にMIL記号で図式された論理回路、
最終的に演算したものが右側に出力される、というイメージです。

では、論理回路の中身を見ていきましょう。
以下がMIL記号の各記号が対応する論理回路の表です。

例えば、AND演算をMIL回路で行うと次のようになります。
1本の電線ごとに0か1が入っています。

AND演算は二つのデータを使う演算なので、
左側の2本の電線から入力して、右側の1本から出力しています。
イメージできましたか?

今度は複数の論理回路の例です。
先ほどと同じく、1本の電線ごとに0か1が入っています。

●の交差で電線がつながっており、何もない交差は繋がっていません。
繋がった電線には、同じデータが通っている事が分かるでしょうか。
2つのNOT回路と3つのNAND回路を経て、最終的に0が出力されました。

なお、当然ですが、入力データが変われば出力結果も変わります。
ためしに、両方に1を入力してみましょう。

このように、MIL回路に数字を入力して確かめるケースは多いです。
論理演算の記号で惑わされがちですが、ANDとORの記号の違い、
NOT(○)の有無に気を付けながらMIL回路を読んでください。

以下は何も入力されていないMIL回路です。
練習問題だと思って、データにそれぞれ0と1を入れてみましょう。

できましたか?
では、実際に数値を入力してみましょう。

まずは、論理演算を行ってない状態です。
ここまではただ数字を通すだけなので、簡単だと思います。
それでは、一気に論理演算を行ってみましょう。

2回のNOT回路と2回のOR回路、最後のAND回路を経て、
最終的な出力結果は1になりました。

ちなみに、入力データが1,1の場合、0,0の場合だと最終出力が1になります。
せっかくなので、実際に数を入れて確かめてみてください。

 

4-2 半加算機と全加算機

さて、コンピュータ内部の論理回路に触れてきましたが、
今度はコンピュータの中で行われる加算についてお話しします。
なぜ論理演算の途中に加算が?と思われるかもしれませんが、
おいおい説明しますので、まずはこちらをご覧ください。

例として、ビット列0101とビット列0011の加算を見ていきましょう。


算数の筆算的な図を作成してみました。
一桁目の二つの数値の加算を半加算と呼び、
二桁目以降の三つの数値の加算を全加算と呼びます。

感覚的に理解できましたか?
では、内部ではどう動いているのか、これから説明していきます。

 

4-3 半加算器のしくみ

実は、半加算も全加算も論理回路で出来てるんです。
コンピュータ的に半加算を実現する演算装置を、半加算器と言います。
実際に、どんな論理回路か見てみましょう。
X、Yが入力データ、Cが桁上がり(Carry)、Sが合計値(Sum)です。

ここで注目してほしいのは、半加算器自体に次の桁に値を渡す回路が
備わっている事です。つまり半加算の機能は、

①値のビットの合計値を出力

②次の桁への桁上がりを出力

の二つだと言えます。

早速、前回の例(4-2を参照)を使って、
1 + 1を半加算器で見てみましょう。

C=1、S=0になりました。

4-4 全加算器のしくみ

半加算器があるので、全加算器もあります。
早速、MIL記号で覗いてみましょう。
X,Yが入力、C’が前桁からの桁上がり、Cが出力後の桁上がり、Sが合計です。

見覚えのある回路が2か所ありますね。
実は、半加算器2つとOR回路1つで出来ているんです。
イメージしにくいと思うので、行われてる事を順番に見ていきましょう。

①XとYで半加算器①で半加算を行う。
 合計値を半加算器②に。

②①の合計値とC’で半加算器②で半加算を行う。

③①と②の桁上がり同士でOR演算。

④②の結果が合計値、③の結果が桁上がりになる。

以上です。
半加算器のときと同様に、1+0+1を入れて確かめてみましょう。

結果はC=1、S=0になりました。

 

5 終わりに

論理演算という新しい演算方法、その応用方法、
そして論理演算で説明できるコンピュータの中身について触れてきました。

ここまでの中にも試験問題は幾つも含んでいますが、
フローチャートのように、後の章に接続する項目も含んでいます。
流し見した方は、折り返して一から確認してみてください。
論理演算の仕組みを正しく理解された方は、是非次の項に進んでみましょう。