AND・OR・NOT・XOR・NAND・NORの6種類の論理演算を、回路風ダイアグラムと真理値表で理解する。
論理演算とは、真(1)と偽(0)の2つの値だけを扱い、決められた規則で結果を出す演算です。コンピュータの内部では電気信号のON/OFFで0と1を表現しており、すべての計算の土台になっています。
論理演算はAND・OR・NOTの3つが基本で、さらにXOR・NAND・NORもよく使われます。上のツールで演算を切り替え、スイッチをON/OFFすると回路図と真理値表がリアルタイムに変わります。まず直感的に触ってみてください。
真理値表のハイライト行が現在のスイッチ状態に対応しています。全パターンを確認するにはスイッチを4通り試すだけです。
論理演算は数学のように見えますが、日常の言葉で考えるとシンプルです。「傘があるかつ雨が降っている → 傘をさす」がAND、「暑いまたはのどが渇く → 水を飲む」がORです。
注意が必要なのは、日常会話の「または」は「どちらか一方だけ」を意味することが多いですが、論理演算のORは「どちらか一方、または両方」を含みます。「どちらか一方だけ」を表すのはXOR(排他的論理和)です。
NOTは「〜ではない」です。「雨が降っていない(NOT 雨)」のように、条件を反転させます。上のツールでNOTを選ぶと、入力Aだけで結果が決まることを確認できます。
| A | B | AND | OR | NOT A |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 |
真理値表(しんりちひょう)は、入力の全パターンとその結果を一覧表にしたものです。上の表は基本3演算をまとめたものです。覚え方は次のとおりです。
・AND:両方1のときだけ1(1行だけ1になる)
・OR:どちらか1なら1(1行だけ0になる)
・NOT:ひっくり返す
真理値表を丸暗記するよりも「ANDは厳しい門番、ORは優しい門番」とイメージすると忘れにくくなります。
XOR(排他的論理和)は「片方だけが1のとき1、両方同じなら0」という演算です。ORと似ていますが、両方1のケースで結果が異なります(ORは1、XORは0)。
XORには面白い性質があります。「同じ値で2回XORすると元に戻る」(A⊕B⊕B = A)。この性質は暗号化やパリティチェック(エラー検出)に利用されます。また、一時変数なしで2つの値を交換する「XORスワップ」というテクニックもあります。
上のツールでXORを選び、A=1, B=1 にしてみてください。ORなら1になるところが0になるのがXORの特徴です。
NANDは「NOT AND」の略で、ANDの結果を反転した演算です。両方1のときだけ0、それ以外は1になります。一見地味ですが、実はNANDゲートだけであらゆる論理回路を構成できる「万能ゲート」です。
具体的には以下のように基本ゲートを作れます。
・NOT:A NAND A(同じ入力を2つ入れる)
・AND:(A NAND B) NAND (A NAND B)(NANDの結果をさらにNOT)
・OR:(A NAND A) NAND (B NAND B)(各入力をNOTしてNAND)
実際のCPU内部の論理回路は、製造コスト削減のためにNANDゲートやNORゲートを中心に構成されています。NANDゲートだけですべての論理を構成できるという性質がここで活かされています。
複数の論理演算が混在するとき、優先順位(どれから先に計算するか)が重要です。算数の掛け算が足し算より先に計算されるのと同じ仕組みです。
優先順位は次の順です。
・NOT(最高):まず否定を計算する
・AND(中):次に論理積を計算する
・OR(最低):最後に論理和を計算する
たとえば「A OR B AND NOT C」は「A OR (B AND (NOT C))」と同じです。
迷ったときは括弧をつけるのが安全です。プログラミングでも「意図が明確になる括弧は省略しない」のがベストプラクティスです。
| 演算子 | 種類 | 評価方法 | 用途 |
|---|---|---|---|
| && | 論理AND | 短絡評価 | if文の条件 |
| & | ビットAND | 全ビット計算 | フラグ判定 |
| || | 論理OR | 短絡評価 | if文の条件 |
| | | ビットOR | 全ビット計算 | フラグ設定 |
多くのプログラミング言語では&&(論理AND)と&(ビットAND)は別の演算子です。&&は短絡評価(左が偽なら右を評価しない)で、&は全ビットを計算します。
if文では&&を使い、ビットマスクやフラグ操作では&を使う、と覚えておけば両者を取り違えずに済みます。