矢沢 久雄

 今回は,論理演算を説明します。論理演算とは,True(真)とFalse(偽)だけを使った演算のことです。コンピュータは,ハードウエア的には,論理演算をする装置だと言えます。足し算などの四則演算も,コンピュータの内部では,論理演算の組み合わせとして実現されているのです。TrueとFalseは,2進数の1けたを使って1と0で表せます。論理演算に強くなると,2進数にも強くなれます。すなわち,コンピュータのデータ表現に強くなれるのです。

論理演算の種類

 知らない人はいないかもしれませんが,念のため論理演算の種類を説明しておきます。論理演算には,AND演算(論理積),OR演算(論理和),XOR演算(排他的論理和),NOT演算(論理否定)の4種類があります。論理演算の演算対象となるのは,True(真)とFalse(偽)の2つの値だけです。演算結果もTrueまたはFalseのいずれかになります。論理演算は,算数の四則演算とは異なり,演算結果がけた上がりすることはありません。けたを借りることもありません。

 2つの値だけということは,デジタルICを使うコンピュータに適しています。この講座の第1回で,デジタルICの1本のピンが,+5Vで1を表し,0Vで0を表すと考えれば,それが2進数の1けたとなることを説明しました。+5VをTrue,0VをFalseと考えてみましょう。デジタルICの1本のピンが,論理演算の対象や結果を表すものとなることが分かりますね。

 表1は,毎度おなじみの真理値表です。AとBは演算対象となる値を表し,Xは演算結果を表しています。AND演算,OR演算,XOR演算は,2つの値に対して演算を行ないます。NOT演算は,1つの値に対して演算を行ないます。

AND演算OR演算XOR演算NOT演算
ABXABXABXAX
TrueTrueTrueTrueTrueTrueTrueTrueFalseTrueFalse
TrueFalseFalseTrueFalseTrueTrueFalseTrueFalseTrue
FalseTrueFalseFalseTrueTrueFalseTrueTrue
FalseFalseFalseFalseFalseFalseFalseFalseFalse
表1●論理演算の真理値表

 AND演算は「AがTrueかつBがTrueなら結果がTrue」,OR演算は「AがTrueまたはBがTrueなら結果がTrue」,XOR演算は「AとBが等しくなければ結果がTrue」,NOT演算は「もとの値を反転させる」とおぼえてください。論理演算の結果は,Trueとなる場合だけをおぼえればOKです。結果がTrueでなければ,必ずFalseだからです。

 コンピュータの内部では,2進数を使っているので,TrueやFalseも数値として取り扱われます。例えば,Visual BasicやVisual C++では,0がFalseを表し,0以外の値がTrueを表す約束になっています。0だけがFalseで,1,123,-5,…などはすべてTrueです。これでは,わかり難いので,JavaやC#といった最新のプログラミング言語では,TrueやFalseをプログラミング言語のキーワード(小文字のtrueとfalseが使われます)として使い,それらが何という値なのかを気にしないで済むようになっています。

論理演算の役割

 「論理演算が何の役に立つのだろうか?」と疑問に思っている人もいるでしょう。皆さんにプログラミングの経験があるなら,分岐や繰り返しの条件として論理演算を使うことをご存知でしょう。例えば,「変数aの値が123で,かつ,変数bの値が456なら,特定の処理を行う」のような場合です。これは,「変数aの値が123ということがTrueで,かつ,変数bの値が456ということがTrueなら,特定の処理を行う」というAND演算です。

 論理演算は,分岐や繰り返し以外にも,データを思い通りに変化(四則演算によって得られる数値の変化とは異なります)させたり,データの一部だけを取り出す場合にも使われます。具体例を示しますので,論理演算の役割に対するイメージをつかんでください。以下の例は,Trueを1,Falseを0とした真理値表(表2)と「にらめっこ」しながら考えてください。

AND演算OR演算XOR演算NOT演算
ABXABXABXAX
11111111010
10010110101
010011011
000000000
表2●Trueを1,Falseを0とした真理値表

【AND演算の例】

図1●AND演算は,任意のビットを0にクリアする
 ゾーン10進数形式(ゾーン10進数形式に関しては,この講座の第3回を参照してください)で表された8ビットのデータから,下位4ビットだけを取り出してみましょう。この場合には,ゾーン10進数のデータと00001111でAND演算を行ないます。複数けたのビットからなるデータ同士の論理演算では,対応するけたで論理演算を行ないます。0とAND演算を行うと,結果は必ず0になります。したがって,上位4ビットは,もとの値にかかわらず0にクリアされます。1とAND演算を行うと,結果は変化しません。したがって,下位4ビットは,もとの値のままです。これによって,BCD形式のデータの下位4ビットだけを取り出せたことになります。00001111のように,任意のビットを0にクリアするために使われるデータのことを「マスク・パターン」と呼ぶこともおぼえておいてください。マスク(mask)とは,「覆い隠す」という意味です(図1[拡大表示])。

【OR演算の例】

図2●OR演算は,任意のビットを1にセットする
 今度は,00001001(10進数の9)というデータをゾーン10進数形式(00111001)に変換してみましょう。この場合には,00001001と00110000でOR演算を行ないます。0とOR演算を行うと,結果は変化しません。したがって,下位4ビットは,もとの値のままです。1とOR演算を行うと,結果は必ず1にセットされます。したがって,上位4ビットには,0011というゾーンがセットされます。これで,ゾーン10進数形式への変換が完了です(図2[拡大表示])。

【XOR演算とNOT演算の例】

図3●XOR演算は,任意のビットを反転する
 XOR演算とNOT演算は,どちらも0を1に,1を0に反転させるものです。XOR演算では,1と演算するけただけが反転し,0と演算するけたは変化しません。部分的な反転ができるのです(図3[拡大表示])。NOT演算では,すべてのけたが反転します(図4[拡大表示])。XOR演算は,画像処理でよく使われます。NOT演算は,補数を求めるときの「反転して1」の「反転」のためなどに使われます。

正論値と負論理

図4●NOT演算は,すべてのビットを反転する
 論理演算には,面白い性質があります。それは,AND演算をOR演算であると考えたり,OR演算をAND演算であると考えることができるということです。信じられないような話ですが,実例とともに理屈を説明しましょう。表4-2は,Trueを1,Falseを0とした真理値表でしたが,これとは逆にTrueを0,Falseを1としてAND演算とOR演算の真理値表を作ってみましょう(表3)。

AND演算OR演算
ABX ABX
00 00 00
01 10 10
10 11 00
11 11 11
表3●Trueを0,Falseを1とした真理値表

 まず,AND演算を見てください。これは,Trueを1,Falseを0とした場合のOR演算の真理値表と同じです。次に,OR演算を見てください。これは,Trueを1,Falseを0とした場合のAND演算の真理値表と同じです。すなわち,TrueとFalseを逆に考えれば,AND演算はOR演算であり,OR演算はAND演算なのです。混乱を避けるために,Trueを1,Falseを0とすることを「正論理」と呼び,Trueを0,Falseを1とすることを「負論理」と呼んで区別します。表2は正論理の真理値表で,表3は負論理の真理値表です。

図5●ド・モルガンの法則
 正論理と負論理を理解していただければ,論理演算の公式として有名な「ド・モルガンの法則」を簡単に覚えられます。ド・モルガンの法則とは,AND演算で表された式とOR演算で表された式を相互に変換する方法を示したものです。図5にドモルガンの法則の2つの公式を示しておきます。ここでは,「・」でAND演算,「+」でOR演算,上付きの「 ̄」でNOT演算を表しています。このような表現が使われることも,よくあります。

 ド・モルガンの法則は,情報処理技術者試験の問題としてよく出題されます。公式が覚えられないで苦労している人が多くいます(本当なんですよ!)。「ド・モルガンの法則は,AND演算とOR演算を相互に変換するものである」ということと,「正論理のAND演算とOR演算は,負論理のOR演算とAND演算と同じである」ということを念頭において,しばらく(1)と(2)の公式を眺めてみてください。「な~んだ,当たり前のことを示した公式なんだ!」ということに気が付くでしょう。

 「それでも分からない」という人のために,ヒントを差し上げます。(1)の式は,左辺のAND演算を右辺のOR演算に変換しています。(2)の式は,左辺のOR演算を右辺のAND演算に変換しています(右辺と左辺を逆に見ても構いませんが…)。ポイントは,左辺では,AとBが個別にNOTとなっていることと,右辺では全体がNOTになっていることです。NOTは,TrueをFalse(またはFalseをTrue)に反転させるものですから,正論理を負論理にするものだと考えられます。すなわち,(1)の式は「負論理でAND演算(左辺)を行うと,OR演算の結果を負論理にしたもの(右辺)となる」ことを表し,(2)の式は「負論理でOR演算(左辺)を行うと,AND演算の結果を負論理にしたもの(右辺)となる」ということを表しているのに過ぎません。ご理解していただけたでしょうか。

論理演算で四則演算を実現する

 この回の冒頭で,コンピュータは,論理演算をする装置であり,足し算などの四則演算も内部的に論理演算の組み合わせとして実現されていると説明しました。その具体例を示してみたいと思います。ここでは,説明を簡単にするために,1けた(1ビット)の2進数で足し算を行う例を示します。引き算は補数を使った足し算で実現でき,掛け算は足し算の繰り返しで実現でき,割り算は引き算の繰り返しで実現できます。

 まず,けた上がりを考えずに,2つのビットの足し算を行ってみましょう。0+0=0,1+0=1,0+1=1,1+1=0(けた上がり無視)の4パターンになりますね。これは,何とXOR演算そのものです! すなわちXOR演算は,けた上がりを考えない足し算として使うこともできるのです(表4)。

足し算の結果
ABX
110
101
011
000
表4●足し算の結果はXOR演算と同じ

 それでは,けた上がりを考えた場合はどうなるでしょう(表5)。1+1=10すなわち,2つのビットが両方1のときだけけた上がりしますね。これは,何とAND演算そのものです! したがって,XOR演算とAND演算を組み合わせれば,けた上がりを考えた足し算が実現できることになります。面白いでしょう!

足し算のけた上がり
ABX
111
100
010
000
表5●足し算のけた上がりはAND演算と同じ

 デジタルICの種類には,CPUのように超高機能なものだけでなく,論理演算の機能だけを持ったものもあります。このようなデジタルICには型番が付けられ,複数のメーカーから販売されています。例えば,AND演算用は7408,OR演算用は7432,XOR演算用は7486,NOT演算用は7404といった具合です。論理演算とコンピュータは,切っても切れない関係にあるのです。

 論理演算の話は,データ表現に関係ないと思わないでください。1ビットずつのデータが論理演算されることで,コンピュータが動作しているからです。動作結果として,数字が計算されても,文字が表示されても,グラフィックスが描画されても,それらはビット単位の論理演算の結果なのです。次回は,コンピュータが数値計算を行った場合に生じる誤差の原因と対策を説明します。お楽しみに!