矢沢 久雄
今回は,論理演算を説明します。論理演算とは,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演算 | |||||||
A | B | X | A | B | X | A | B | X | A | X |
True | True | True | True | True | True | True | True | False | True | False |
True | False | False | True | False | True | True | False | True | False | True |
False | True | False | False | True | True | False | True | True | ||
False | False | False | False | False | False | False | False | False | ||
表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演算 | |||||||
A | B | X | A | B | X | A | B | X | A | X |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
表2●Trueを1,Falseを0とした真理値表 |
【AND演算の例】
![]() |
図1●AND演算は,任意のビットを0にクリアする |
【OR演算の例】
![]() |
図2●OR演算は,任意のビットを1にセットする |
【XOR演算とNOT演算の例】
![]() |
図3●XOR演算は,任意のビットを反転する |
正論値と負論理
![]() |
図4●NOT演算は,すべてのビットを反転する |
AND演算 | OR演算 | ||||
A | B | X | A | B | X |
0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 0 | 0 |
1 | 1 | 1 | 1 | 1 | 1 |
表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演算を相互に変換するものである」ということと,「正論理の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)。
足し算の結果 | ||
A | B | X |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
表4●足し算の結果はXOR演算と同じ |
それでは,けた上がりを考えた場合はどうなるでしょう(表5)。1+1=10すなわち,2つのビットが両方1のときだけけた上がりしますね。これは,何とAND演算そのものです! したがって,XOR演算とAND演算を組み合わせれば,けた上がりを考えた足し算が実現できることになります。面白いでしょう!
足し算のけた上がり | ||
A | B | X |
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
表5●足し算のけた上がりはAND演算と同じ |
デジタルICの種類には,CPUのように超高機能なものだけでなく,論理演算の機能だけを持ったものもあります。このようなデジタルICには型番が付けられ,複数のメーカーから販売されています。例えば,AND演算用は7408,OR演算用は7432,XOR演算用は7486,NOT演算用は7404といった具合です。論理演算とコンピュータは,切っても切れない関係にあるのです。
論理演算の話は,データ表現に関係ないと思わないでください。1ビットずつのデータが論理演算されることで,コンピュータが動作しているからです。動作結果として,数字が計算されても,文字が表示されても,グラフィックスが描画されても,それらはビット単位の論理演算の結果なのです。次回は,コンピュータが数値計算を行った場合に生じる誤差の原因と対策を説明します。お楽しみに!