「コンピュータの回路」③　基本回路の応用（NAND・NOR・EOR回路）

##基本回路を組み合わせた論理回路
基本回路（AND・OR・NOT回路）を組み合わせることでさらに複雑な論理回路を作ることが出来ます。
代表的なものが**「否定論理積回路（NAND回路）」、「否定論理和回路（NOR回路）」
「排他的論理和回路（EOR回路）」**の3つになります。
これらの回路を使って、コンピュータは基本回路だけを使う時よりも複雑な制御を行うことができるようになります。

##否定論理積回路（NAND回路）
「否定論理積回路（NAND回路）」は、論理積（AND）と否定（NOT）を組み合わせた論理回路のことです。
つまり、**論理積（AND）の結果を否定（NOT）によって反転させたものが出力**となります。
したがって、たとえば、入力がどちらも「$1$」である場合には「$0$」が出力され、それ以外の時には「$1$」が出力されます。

回路図を以下の図に示します。
![スクリーンショット 2020-11-10 10.48.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/5498f0ed-9975-3895-29c9-2e8e8e4d6907.png)
※上の回路図がNAND回路であり、下の回路図はNAND回路の動作を分かりやすくするためにAND回路とNOT回路を結合させた回路になります。

否定論理積（NAND）の論理式は「‾」と「•」を使って表現します。
上の図のNAND回路について、入力Aと入力B、出力Yを用いて論理式にすると以下のようになります。
![スクリーンショット 2020-11-10 11.13.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/f41f715a-2a32-bab2-ae20-d7495d591bde.png)
入力AとBはそれぞれ「$1$」と「$0$」を出力することができるので、入力AとBの組み合わせは4パターンになります。
さらに、NAND回路は、図の下の回路図のように、内部でAND回路とNOT回路を結合させたものと同じ形になります。
つまり、**論理積（AND）の結果がいったん出力Y'として出力されて、さらにそれが否定（NOT）に入力されて反転された後に出力Yとして出力されている**のと同じです。

このことを踏まえて、以下に論理積回路（NAND回路）の真理値表を示します。

| 入力A | 入力B | 出力Y' |出力Y　(「出力Y'」の否定 )|
|:-:|:-:|:-:|:-:|
| 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
真理値表から、入力AとBがどちらも「$1$」の時、出力Yが「$0$」であることがわかります。
入力Aと入力Bの結果を出力Y'として真理値表に書くとその後の反転処理（否定）がしすくなります。
上に示した回路図では入力Aが「$1$」で入力Bが「$1$」なので出力Y'で「$1$」となり、最終的に出力Yで「$0$」となっています。
この状態は真理値表の4行目で表現されています。

##否定論理和回路（NOR回路）
「否定論理和回路（NOR回路）」は、論理和（OR）と否定（NOT）を組み合わせた論理回路のことです。
つまり、**論理和（OR）の結果を否定（NOT）によって反転させたものが出力**となります。
したがって、たとえば、少なくとも1カ所で「$1$」が入力された場合には「$0$」が出力され、全ての入力部分で「$0$」が入力された時には「$1$」が出力されます。

回路図を以下の図に示します。
![スクリーンショット 2020-11-10 11.28.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/642243cb-97b9-4fa2-5731-15a9e2b75941.png)
※上の回路図がNOR回路であり、下の回路図はNOR回路の動作を分かりやすくするためにOR回路とNOT回路を結合させた回路になります。

否定論理積（NOR）の論理式は「‾」と「+」を使って表現します。
上の図のNOR回路について、入力Aと入力B、出力Yを用いて論理式にすると以下のようになります。
![スクリーンショット 2020-11-10 11.33.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/6dc56d80-a8fd-7bb9-e508-889ccaa39ff1.png)
入力AとBはそれぞれ「$1$」と「$0$」を出力することができるので、入力AとBの組み合わせは4パターンになります。
さらに、NOR回路は、図の下の回路図のように、内部でOR回路とNOT回路を結合させたものと同じ形になります。
つまり、**論理和（OR）の結果がいったん出力Y'として出力されて、さらにそれが否定（NOT）に入力されて反転された後に出力Yとして出力されている**のと同じです。

このことを踏まえて、以下に論理和回路（NOR回路）の真理値表を示します。

| 入力A | 入力B | 出力Y' |出力Y　(「出力Y'」の否定 )|
|:-:|:-:|:-:|:-:|
| 0 | 0 | 0 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 0 |
真理値表から、入力AとBがどちらも「$1$」の時、出力Yが「$0$」であることがわかります。
上に示した回路図では入力Aが「$1$」で入力Bが「$0$」なので出力Y'で「$1$」となり、最終的に出力Yで「$0$」となっています。
この状態は真理値表の3行目で表現されています。

##排他的論理和回路（EOR回路）
「排他的論理和回路（EOR回路）」は、全ての入力部分に「$0$」が入力された時に「$0$」を出力し、全ての入力部分に「$1$」が入力された時にも「$0$」を出力します。
つまり、入力部分で同じ値が入力された時だけ「$0$」を出力します。
また、それ以外の時、つまり少なくとも1つの入力部分が他の入力部分とは異なった値の時には「$1$」が出力されます。

回路図を以下の図に示します。
![スクリーンショット 2020-11-10 11.56.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/895e5d64-6669-ae0d-79f9-6a20719b516f.png)
排他的論理和（EOR）の論理式は「⊕」を使って表現します。
上の図のEOR回路について、入力Aと入力B、出力Yを用いて論理式にすると以下のようになります。
![スクリーンショット 2020-11-10 12.04.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/4b0888fb-8d69-a3d3-ddd3-8987f386598c.png)


入力AとBはそれぞれ「$1$」と「$0$」を出力することができるので、入力AとBの組み合わせは4パターンになります。

このことを踏まえて、以下に排他的論理和回路（EOR回路）の真理値表を示します。

| 入力A | 入力B | 出力Y |
|:-:|:-:|:-:|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
真理値表から、入力AとBがどちらも「$1$」の時、出力Yが「$0$」になっています。
同様に、入力AとBがどちらも「$0$」の時、出力Yが「$0$」になっています。
したがって、入力AとBが同じ値を入力した時、出力Yでは「$0$」が出力されることが分かります。

そして、入力AとBのどちらか一方だけが「$1$」の時、出力Yが「$1$」になっています。
このことから、入力AとBで異なる値が入力された時、出力Yが「$1$」になることが分かります。

上に示した回路図では入力Aが「$1$」で入力Bが「$1$」なので出力Yで「$0$」になっています。
この状態は真理値表の4行目で表現されています。

***
<details>
<summary>排他的論理和（EOR）についてもっと詳しく</summary>
排他的論理和は、論理学の世界では「排反的選言」と呼ばれています。
「選言」とは論理演算で言うならば「OR」と同じことを意味します。
「排他的」と「排反的」については言葉が違うだけで実際には同じような意味を持ちます。
つまり、「同じようなものを退けること」が主な意味になります。
したがって、排他的論理和を真理表を踏まえて考えると「同じ値が入力されたときに0（偽：False）とする」というものだと考えることが出来ます。
ここで、「選言（OR）」と「排他的選言（EOR）」はどのように違うのかを具体例を使って考えてみたいと思います。
たとえば、2人の登山家PとQがある山に登ろうとして**「狼か熊が出るから注意しろ」**という注意書きがされているのを見たとします。
そこで、登山家Pがこれを「選言（OR）」の立場で考えたとします。
すると、Pは「狼が出るかもしれないし、熊が出るかもしれないし、**両方とも出るかもしれない**。」と受け取ります。
そして、登山家Qはこれを「排他的選言（EOR）」の立場で考えたとします。
すると、「狼が出るかもしれないし、熊が出るかもしれないけど、**両方とも出ることは絶対にない**。」と受け取ります。
登山家PとQはそれぞれの立場で注意書きの意味を受け取ったわけですが、「狼と熊のいずれか一方が出る」という部分に関しては一致しています。
しかし、狼と熊が両方とも出てくるというケースに関しては考えが異なっています。
「選言（OR）」の立場をとる登山家Pと「排他的選言（EOR）」の立場を取るQ、そして、狼と熊について、登山中に出てくることを「1」、出てこないことを「0」とすると、次のような表を作ることが出来ます。
<div>

| 狼 | 熊 | 登山家P（OR） | 登山家Q（EOR） |
|:-:|:-:|:-:|:-:|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 0 |

</div>
この表は登山家PとQの立場を明確に表しています。
特に、狼が「1（出る）」で熊が「1（出る）」の時、つまり真理表の4行目の場合に注目してください。
登山家P（OR）はそのことを「真（1）」と受け取っていますが、登山家Qは「偽（0）」と受け取っています。
このことが、(OR)と（EOR）の違いであると言えます。
改行がうまく出来ず、非常に読みにくかったかもしれませんが、論理演算の理解の一助となれば幸いです。
最後まで読んで頂きありがとうございました。
</details>
***

##参考にさせて頂いた書籍
きたみりゅうじ 『キタミ式イラストIT塾 基本情報技術者平成31/01年』 技術評論社 2019年
野矢茂樹　『論理学』　東京大学出版会　2019年

##学習してみて
今回は論理回路についての学習でしたが、NAND回路やNOR回路については途中のプロセスを把握できるように出力Y'という中間地点を作ってみたことで理解が早まりました。
論理回路は好き嫌いがはっきりと分かれそうな内容だとは思いますが、慣れるとパズルのようで少し面白かったように感じました。