コンピュータの仕組み

<h2>目次</h2>

<b>・はじめに</b>
<b>・コンピュータの中身を知る</b>
<b>・電気の話</b>
<b>・2進数の話</b>
<b>・論理代数</b>
<b>・機械語</b>
<b>・デコーダ</b>
<b>・最後に</b>

<h2>はじめに</h2>

現在では高級言語を使ったプログラミングが主流となっています。
高級言語とは、「Java」や「Python」などに代表される、人間にとって読み書きしやすいプログラミング言語のことです。
しかしこれらの言語をコンピュータが直接解釈するわけではなく、内部でコンピュータが解釈可能な「機械語」という形に翻訳されてから処理が実行されます。
つまり高級言語で書かれたソースコードは、機械語に翻訳され、その機械語をコンピュータが読み取って動くわけですが、近年ではこれらを全く知らずとも開発が可能になってきました。
悪く言えば<b>コンピュータの中身がブラックボックス化</b>してきており、ソースコードによってコンピュータに命令をしているが、肝心のコンピュータがどのように動いているのかを知らないという人が増えました。

本記事ではそんなブラックボックス化したコンピュータの中身について、個人的に勉強した内容をまとめました。
仰々しいタイトルですが、あまり大したことは書いていません。コンピュータを理解するための一助となるような軽い読み物だと思って下さい。
よくあるコンピュータアーキテクチャの本の内容を焼き直しても仕方がないので、少し毛色の異なった感じになっています。

<h2>コンピュータの中身を知る</h2>

現代社会ではほとんど全ての人がコンピュータを使用しており、仕事のデスクにはパソコンが乗っているし、スマホを使ってLINEをしたり、SNSを見たりしています。家にはテレビやエアコンなどの家電があります。
(パソコンだけをコンピュータと思っている方がいるかもしれませんが、スマホや家電も立派なコンピュータです。https://toragi.cqpub.co.jp/Portals/0/backnumber/2008/04/p102-103.pdf)
これだけ多くの人がコンピュータを使用しているにも関わらず、コンピュータの中身がブラックボックス化している理由は何でしょうか。
あくまで個人的な見解ですが、その理由の一つとして、<b>コンピュータの中を実際に開けて見たことがないせいで、内部で何が起こっているのかイメージが湧きにくい</b>ということが考えられます。
そこでまずは、<b>パソコンの内部構造がどうなっているかを知る</b>ことで、コンピュータへのイメージを膨らましていこうと思います。
とはいえ、実際に中を開けて見て下さいと言われても困ると思うので、パソコンの中身を詳しく図解したサイトをご紹介します。

情報機器と情報の仕組み素材集
http://www.sugilab.net/jk/joho-kiki/index-sample.html
>このサイトについて （著作権に関する記述を含む） 
　本サイトは、文部科学省が実施した平成１３年度「教育用コンテンツ開発事業」により、「情報機器と情報社会のしくみ」開発委員会により制作され、同、平成14年度「教育用コンテンツ開発・改善・普及に関わる研究事業」 （いづれも主査：永野和男　聖心女子大学教授）により普及活動が行われています。

このサイトはコンピュータの中で何が起きているのかを知るのに大変役立ちました。特に動画による解説がありがたかったです。興味がある方は是非サイトをじっくり見て下さい。

コンピュータとは言うなれば<b>巨大な電気回路</b>であり、キーボードの打鍵やマウスクリックなどの物理的な刺激により通電し、電気信号が流れ、回路に流れる電気信号を検知して決められた動きをします。
それでは、コンピュータを動かす原動力であり、現代の生活には欠かすことのできない「電気」というものの正体を改めて見ていきたいと思います。

<h2>電気の話</h2>

電気とは何でしょうか。
電気の正体とは、一言で言えば<b>「自由電子の運動が引き起こす様々な現象の総称」</b>です。

原子の話から順を追って説明していきます。
全ての物質は<b>原子</b>から出来ており、原子は<b>原子核</b>とその周りを回る<b>電子</b>で構成されています。
さらに原子核は<b>陽子</b>と<b>中性子</b>に分けることができます。
陽子は+の電荷を、電子は−の電荷を持ちます。(中性子は電荷を持ちません。)
![DEDA5D1E-27C4-4B9A-817E-3BBEED99FD99.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/ea3a9f61-535e-07d2-00e3-e396671d97dd.png)
+の電荷と−の電荷の間には引き付け合う力が働きます。(これは<b>電磁気力</b>という、電気を帯びた粒子にはたらく力によるものです。)
原子核の<b>陽子の個数=原子番号</b>であり、原子核の周りには<b>陽子と同じ個数の電子</b>が回っています。
陽子の数は変わりませんが、<b>原子核の周りを飛んでいる電子の数は変わることがあります。</b>原子は電子を放出したり受け取ったりすることができるのです。
原子核から離れて自由に動くことができるようになった電子を<b>自由電子</b>と呼びます。この自由電子が、様々な電気による現象を引き起こす主役となります。

原子が自由電子を放出する(あるいは受け取る)理由についても少し触れておきましょう。
原子には<b>イオン化エネルギー</b>というものがあり、これが高いほど安定した状態にあります。
イオン化エネルギーが高い原子というのは主に周期表の右側、つまりK殻やL殻の軌道に電子が満たされた状態の原子です。
![A6989C62-AE98-4E44-8606-4816828C08BC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/d1208a67-2913-de5e-a0d2-a4d4b70c25f0.jpeg)
エネルギー的に不安定な原子は、より安定した構造を取りたいために電子の授受を行うという理屈です。
例えばMgであれば、K殻に2個、L殻に8個、M殻に2個という電子配置をしています。表を見れば分かるように、Mgはイオン化エネルギーが低い、即ち安定していないため、M殻にある余分な電子2個を放出して、安定した原子であるNeと同じ構造を取ろうとします。
この時放出された2個の電子が自由電子として、原子核を離れて動き回れるようになるというわけです。

電気の基本的な単位である、<b>「電流」</b>、<b>「電圧」</b>、<b>「電気抵抗」</b>についても復習しておきましょう。これらは中学校で習ったオームの法則に登場する単位です。
電気の世界には<b>電位</b>というものが存在します。電位とは電気の世界で言う<b>「高さ」</b>のことだと考えて下さい。(正確には、ある点から基準点まで単位電荷(+1C)を動かした場合の外力(=静電気力)に逆らう仕事量のこと。)
物体が高いところから低いところに向かって落下するのと同じように、正の電荷も電位が高いところから低いところへ向かって移動します。(正確には、自由電子が電位の低いところから高いところへ移動しており、仮想的に等価な＋電荷が電位の高いところから低いところに移動していると捉えます。)
この時の<b>電荷の動き</b>を電流と呼びます。
電流の単位は<b>A[アンペア]</b>であり、「毎秒1クーロンの電荷を流すような電流を1A」として定義されます。
電圧とは<b>二点間の電位の差</b>のことです。(厳密にはこの表現には少し問題がありますが、電位差のことと思ってもらって差し支えないです。)
電圧の単位は<b>V[ボルト]</b>であり、「1Aの電流が流れる導体の2点間において消費される電力が1Wであるとき、その2点間の電圧を1V」として定義されます。
電気抵抗とは字の表す通り、<b>電流の流れやすさ</b>(流れにくさ)のことです。
単位は<b>Ω[オーム]</b>であり、「1Vの電圧をかけたときに1Aの電流が流れる電気抵抗を1Ω」として定義されます。
電流が流れやすい物体、すなわち電気抵抗が小さい物体のことをを<b>導体</b>と言います。銅などが代表的な導体です。逆に電気抵抗が大きく電流をほとんど流さないような物体を<b>絶縁体</b>と言います。
物体によって電気抵抗が異なる理由について詳しく知りたい方はこちらの動画をご覧下さい。
https://youtu.be/viw4Fik2904

このように、中学校や高校で習った電気の話を利用して作られたものが電気回路です。
コンピュータは大変複雑な電気回路ではありますが、その動作の根幹にあるのは電気の働きです。
多くの技術者にとってはこのような知識は必要ないと思いますが、知っておくとコンピュータに対して少し親しみが湧きますね。
電気の話の次は、コンピュータで数を扱う方法について考えてみます。

<h2>2進数の話</h2>

コンピュータとは論理演算を実現した電子回路(=論理回路)です。
論理演算とは、ざっくり言えば<b>「真」(命題が正しい)と「偽」(命題が正しくない)の2つの値だけを用いて行う演算</b>のことです。
論理演算における<b>「真, 偽」</b>を<b>「電圧の大, 小」</b>や<b>「電流の大, 小」</b>、<b>「メモリに電荷が蓄えられている, いない」</b>などの電気的な2値で区別できる形に対応させることで、論理演算を電子回路で扱うことができます。
真偽の区別は多くの場合<b>電圧の高低</b>で区別します。
真を高電圧に対応させ、 偽を低電圧に対応させる方法が多く見られます。このような対応を正論理と言います。(もちろん真を低電圧に対応させ、偽を高電圧に対応させても理屈的には問題ありません。)
具体的な電圧の高低の値は、例えば5V電源だけを使う回路なら、高電圧は5V, 低電圧は0Vとなります。昔の半導体論理回路では5V電源のものが多かったようですが、最近はもっと低電圧で動くものが多くなっているらしいです。電圧が低い方が電力消費を抑えられるので経済的だからです。

また、コンピュータの計算には<b>2進数</b>(0と1だけを用いた計算)が採用されています。
論理演算における<b>「真, 偽」</b>を数字の<b>「1, 0」</b>に対応させることで、論理演算と数値演算を統一的に扱えます。
今までの話を整理すると、
<b>論理演算の真/偽 = 数字の1/0 = 電圧の高/低</b>
という対応関係になります。

コンピュータを動かしている命令の実体は、電圧の高/低などの2値の組み合わせで表現できる電気信号です。
それを分かりやすく1と0を使った2進数で書き表すというわけです。

このように情報を2値で扱うことのメリットについても考えてみます。
例えば、電圧の高低だけをコンピュータ内部で判定することで、<b>ノイズが入りにくく、作りが簡単になる</b>というメリットが挙げられます。
もし仮に、コンピュータに10段階の電圧の違いを判定させようとすれば、電圧が最も低い状態を0、それより少しだけ電圧が高い状態を1、更にそれより少しだけ電圧が高い状態を2, ... のような僅かな違いを正しく判定せねばならず、その分作りが複雑になるでしょう。複雑になればなるほど判定を誤って情報の伝達ミスが起こる可能性も高まります。
電圧が高いか、低いかという2元的な情報だけを判断するのであれば判断ミスは起こりにくいですし、作りも簡単になります。

もしノイズやその他の問題を解決できるのであれば、2値だけと言わず、3値, 4値...とより多くの情報を1つのトランジスタで扱えるようにすることで、コンピュータを高性能化できる可能性があります。
そのため多値論理をコンピュータに導入する研究も盛んに行われているようです。(https://engineer.fabcross.jp/archeive/190614_shrinking-transistors.html )

<h2>論理代数</h2>

x が<b>論理値(真理値)をもつ</b>とは、<b>xが0(偽)か1(真)のどちらかの値を取ること</b>を言います。
すなわち
<b>x ≠ 0 ならば x = 1
x ≠ 1 ならば x = 0</b>
が成り立つことを言います。
論理代数は、論理値 (0,1) に関する、<b>論理積(AND)</b>、<b>論理和(OR)</b>、<b>否定(NOT)</b>という三つの演算からなる代数系として定義されます。なお、論理積、論理和、否定は次のように定義されます。

(論理積)
![55F744BF-92C8-48AD-AF7B-B943064F6A7D.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/488d9223-ad33-bf70-7863-fd27ec725163.gif)

(論理和)
![A085B965-2C2E-4BAA-ACD1-24407B3459F9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/7cfa43a2-4ecd-0165-87a2-050df338b961.gif)

(否定)
![31588D84-D48E-41C6-9A26-5E4C0284BF19.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/036b3929-3406-de95-d612-3c7cf823d5b6.gif)

論理関数の全ての入力の組合せに対する出力を列挙した表を<b>真理値表</b>と呼びます。当然ですが<b>真理値表と論理関数は1対1に対応</b>します。すなわち、一つの真理値表はただ一つの論理関数に対応し、一つの論理関数はただ一つの真理値表により表現されるということです。
一方、<b>論理式は論理関数の一意な表現ではありません。</b>一つの論理式はただ一つの論理関数を定めますが、一つの論理関数は複数の(無数の)論理式で表現できます。
<b>任意の論理関数に対して，それを表す論理式が少なくとも一つは存在する</b>ことを、論理式の<b>完全性</b>と言います。
では、論理式で(AND,OR,NOTを使って)全ての論理関数が表現できることを示します。

>シャノン展開
任意の論理関数 F(x1, x2, x3, . . . , xn) は，以下のとおり展開できる.
F(x1,x2,x3,...,xn)
= x1 ̄·F(0,x2,x3,...,xn) + x1·F(1,x2,x3,...,xn)

これが成り立つことは、x1が0の場合と1の場合でそれぞれ両辺を比較すれば明らかでしょう。
シャノン展開によりn変数論理関数を2つの(n-1)変数論理関数の和(OR)の形に展開できます。得られた2つの論理関数それぞれについてもシャノン展開を行うという操作を繰り返せば、最終的に0または1の定数関数だけからなる展開式となります。
以上により、<b>AND、OR、NOTの3つの演算の組み合わせであらゆる論理関数を記述できる</b>ことが示されました。
例として任意の3変数論理関数 F(x, y, z) を論理式で表現してみます。
F(x, y, z) 
= x ̄・F(0, y, z) + x・F(1, y, z)
= x ̄・(y ̄・F(0,0,z) + y・F(0,1,z))
　+ x・(y ̄・F(1,0,z) + y・F(1,1,z))
= x ̄・(y ̄・(z ̄・F(0, 0, 0) + z・F・(0, 0, 1)) 
　　　+ y・(z ̄・F(0, 1, 0) + z・F(0, 1, 1)))
　+
　x・(y ̄・(z ̄・F(1, 0, 0) + z・F(1, 0, 1))
　　　+ y・(z ̄・F(1, 1, 0) + z・F(1, 1, 1)))
= x ̄・y ̄・z ̄・F(0, 0, 0)
　+ x ̄・y ̄・z・F(0, 0, 1)
　+ x ̄・y・z ̄・F(0, 1, 0)
　+ x ̄・y・z・F(0, 1, 1)
　+ x・y ̄・z ̄・F(1, 0, 0) 
　+ x・y ̄・z・F(1, 0, 1) 
　+ x・y・z ̄・F(1, 1, 0) 
　+ x・y・z・F(1, 1, 1) 


上記のAND, OR,NOTの演算は<b>電気回路で実現</b>することが可能で、例えば次のようになります。
(画像はhttps://sagara-works.jp/ より引用。こちらのサイトも大変勉強になりました。)

(AND回路)
![F43AB7FC-6442-44D2-AE3C-9F6F0C12B2FC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/d2bfc06a-73c3-e968-a5d0-60cc40d41ce0.jpeg)

(OR回路)
![C2755471-B5CE-4DE5-A035-B88930205B46.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/aa6d2169-52a4-2232-8bf3-cf6ea4b02564.jpeg)

(NOT回路)
![AF07B229-13F5-4E2B-BF79-6B5DF2F4508B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/10605792-39fc-8552-8430-eb89e89f922d.jpeg)

実際の電気回路ではないですが、回路を次のように簡易的に表現したものを<b>論理ゲート</b>と言います。
(画像はhttps://youtu.be/-EkN6ulxw54 より引用。)
![7B3A9A98-82BD-4679-985F-85B431FF6424.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/e1c42b9c-f866-fce3-4772-09412ba7bdac.jpeg)

AND、OR、NOTの3つの演算であらゆる論理式を記述可能であり、また、これらの演算は電気回路で表せるので、<b>電気回路で様々な論理演算を実現することが可能</b>であることが分かります。

ここからはコンピュータの動きをより具体的にイメージするために、機械語とデコーダについて簡単にご紹介します。

<h2>機械語</h2>

CPUには、そのCPUで実行可能な命令のセットがあらかじめ準備してあり、それらを組み合わせてプログラムを作ります。
しかし、数字の羅列である機械語命令を直接扱うのは困難なので、プログラミングしやすくするための簡略記憶記号として<b>ニーモニック</b>という表記が使われます。
ニーモニックは、機械語命令の機能一つ一つに名前を付けて人間に分かりやすいかたちで表現したものです。(例えば加算を表す命令なら「ADD」など。)
例を見た方がイメージが掴みやすいと思うので、次を見て下さい。
16bitで表される命令のうち、上5桁(赤字の部分)が命令の種類となっています。

<b>例 : 1+2+3+…+10を計算する.</b>

<b>命令0</b>
(機械語)
<font color = "Red">01001</font><font color = "Blue">000</font><font color = "Purple">00000000</font>
(ニーモニック)
<font color = "Red">ldh</font>(<font color = "Blue">REG0</font>, <font color = "Purple">0</font>)
(意味)
<font color = “Blue">レジスタ000</font>(16bitの情報を保存できる記憶素子)<font color = "Red">の上8桁に</font><font color = "Purple">00000000</font><font color = "Red">を書き込む</font>

<b>命令1</b>
(機械語)
<font color = "Red">01000</font><font color = "Blue">000</font><font color = "Purple">00000000</font>
(ニーモニック)
<font color = "Red">ldl</font>(<font color = "Blue">REG0</font>, <font color = "Purple">0</font>)
(意味)
<font color = "Blue">レジスタ000</font><font color = "Red">の下8桁に</font><font color = "Purple">00000000</font><font color = "Red">を書き込む</font>

<b>命令2</b>
(機械語)
<font color = "Red">01001</font><font color = "Blue">001</font><font color = "Purple">00000000</font>
(ニーモニック)
<font color = "Red">ldh</font>(<font color = "Blue">REG1</font>, <font color = "Purple">0</font>)
(意味)
<font color = "Blue">レジスタ001</font><font color = "Red">の上8桁に</font><font color = "Purple">00000000</font><font color = "Red">を書き込む</font>

<b>命令3</b>
(機械語)
<font color = "Red">01000</font><font color = "Blue">001</font><font color = "Purple">00000001</font>
(ニーモニック)
<font color = "Red">ldl</font>(<font color = "Blue">REG1</font>, <font color = "Purple">1</font>)
(意味)
<font color = "Blue">レジスタ001</font><font color = "Red">の下8桁に</font><font color = "Purple">00000001</font><font color = "Red">を書き込む</font>

<b>命令4</b>
(機械語)
<font color = "Red">01001</font><font color = "Blue">010</font><font color = "Purple">00000000</font>
(ニーモニック)
<font color = "Red">ldh</font>(<font color = "Blue">REG2</font>, <font color = "Purple">0</font>)
(意味)
<font color = "Blue">レジスタ010</font><font color = "Red">の上8桁に</font><font color = "Purple">00000000</font><font color = "Red">を書き込む</font>

<b>命令5</b>
(機械語)
<font color = "Red">01000</font><font color = "Blue">010</font><font color = "Purple">00000000</font>
(ニーモニック)
<font color = "Red">ldl</font>(<font color = "Blue">REG2</font>, <font color = "Purple">0</font>)
(意味)
<font color = "Blue">レジスタ010</font><font color = "Red">の下8桁に</font><font color = "Purple">00000000</font><font color = "Red">を書き込む</font>

<b>命令6</b>
(機械語)
<font color = "Red">01001</font><font color = "Blue">011</font><font color = "Purple">00000000</font>
(ニーモニック)
<font color = "Red">ldh</font>(<font color = "Blue">REG3</font>, <font color = "Purple">0</font>)
(意味)
<font color = "Blue">レジスタ011</font><font color = "Red">の上8桁に</font><font color = "Purple">00000000</font><font color = "Red">を書き込む</font>

<b>命令7</b>
(機械語)
<font color = "Red">01000</font><font color = "Blue">011</font><font color = "Purple">00001010</font>
(ニーモニック)
<font color = "Red">ldl</font>(<font color = "Blue">REG3</font>, <font color = "Purple">10</font>)
(意味)
<font color = "Blue">レジスタ011</font><font color = "Red">の下8桁に</font><font color = "Purple">00001010</font><font color = "Red">を書き込む</font>

<b>命令8</b>
(機械語)
<font color = "Red">00001</font><font color = "Blue">010</font><font color = "Purple">001</font>----
(注 : -は命令に関係のない部分で0と1どちらでもよい)
(ニーモニック)
<font color = "Red">add</font>(<font color = "Blue">REG2</font>, <font color = "Purple">REG1</font>)
(意味)
<font color = "Purple">レジスタ001</font><font color = "Red">の値を</font><font color = "Blue">レジスタ010</font><font color = "Red">に加算する</font>

<b>命令9</b>
(機械語)
<font color = "Red">00001</font><font color = "Blue">000</font><font color = "Purple">010</font>-----
(ニーモニック)
<font color = "Red">add</font>(<font color = "Blue">REG0</font>, <font color = "Purple">REG2</font>)
(意味)
<font color = "Purple">レジスタ010</font><font color = "Red">の値を</font><font color = "Blue">レジスタ000</font><font color = "Red">に加算する</font>

<b>命令10</b>
(機械語)
<font color = "Red">01110</font><font color = "Blue">000</font><font color = "Purple">01000000</font>
(ニーモニック)
<font color = "Red">st</font>(<font color = "Blue">REG0</font>, <font color = "Purple">64</font>)
(意味)
<font color = "Red">RAM(I/O)の</font><font color = "Purple">01000000番地</font><font color = "Red">に</font><font color = "Blue">REG000</font><font color = "Red">の値を出力する</font>

<b>命令11</b>
(機械語)
<font color = "Red">01010</font><font color = "Blue">010</font><font color = "Purple">011</font>-----
(ニーモニック)
<font color = "Red">cmp</font>(<font color = "Blue">REG2</font>, <font color = "Purple">REG3</font>)
(意味)
<font color = "Blue">REG010</font><font color = "Red">と</font><font color = "Purple">REG011</font><font color = "Red">を比較して一致すれば Flag = 1 とする</font>

<b>命令12</b>
(機械語)
<font color = "Red">01011</font>---<font color = "Purple">00001110</font>
(ニーモニック)
<font color = "Red">je</font>(<font color = "Purple">14</font>)
(意味)
<font color = "Red">Flag = 1 であれば</font><font color = "Purple">00001110</font>(命令14)<font color = "Red">に飛ぶ</font>

<b>命令13</b>
(機械語)
<font color = "Red">01100</font>---<font color = "Purple">00001000</font>
(ニーモニック)
<font color = "Red">jmp</font>(<font color = "Purple">8</font>)
(意味)
<font color = "Purple">00001000</font>(命令8)<font color = "Red">に無条件で飛ぶ</font>

<b>命令14</b>
(機械語)
<font color = "Red">01111</font>-----------
(ニーモニック)
<font color = "Red">hlt</font>()
(意味)
<font color = "Red">CPUを停止する</font>

簡単にプログラム全体の説明をします。
REG1は定数(=1)です。
REG3も定数(=10)です。
REG2は初期値が1で、1回ループするごとにREG1の値(=1)が加算されます。従ってREG2の値はループ回数を表します。
REG0は初期値が0で、1回ループするごとにREG2の値、即ちループ回数が加算されます。
よってREG0 = 0 + 1 + 2 … と値が増加していきます。
REG2 = REG3となったら(即ち10回ループ後)命令14に飛んで計算を終了します。
終了前の最後のループでは、
REG0 = 0 + 1 + 2 + … + 10 = 55 となっています。

こちらの例と命令コードは<a href = "https://www.amazon.co.jp/動かしてわかる-CPUの作り方10講-井澤-裕司/dp/4297108216">動かしてわかるCPUの作り方10講</a>にあるものと同じものを使わせていただきました。(もちろん、命令コード自体に意味があるわけではないので、何らかの命令に対して好きな2進数を割り振って構いません。)
この本も購入して読みましたが、大変参考になりました。初めてコンピュータアーキテクチャを学ぶ人にも読みやすく、それでいて内容もしっかりしている本だと思うので、興味のある人は是非読んでみて下さい。

<h2>デコーダ</h2>

<b>エンコーダ</b>(符号器)とは人間が扱う10進数や文字などの情報を、コンピュータが扱う2進数やコード情報に変換するための回路です。
一方、<b>デコーダ</b>(復号器)とはその逆に、演算結果の2進数を10進数に変換して液晶に表示したりする回路です。
有名や例として4桁の2進数を10進数(0〜9)として表示するデコーダ回路を見てみましょう。
これは7セグメントLEDディスプレイと呼ばれます。
![E07D56EF-E64C-4A66-9F43-2B56535389E7.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/a86213f1-a213-9589-fb8f-e454325da976.jpeg)

例えば「3」を表示したければa,b,c,d,gを1(点灯)にします。
![E07D1ACD-2C3F-4C9E-8FB6-447D15AB2527.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/c0d24ead-676d-44ad-e1c9-0abbfaec241d.jpeg)

真理値表は以下のように書けます。
![2596DC20-1AA2-4F0F-934C-0719C1C6BB80.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246243/7931d051-c7eb-e98a-1b8d-0d5b818b5605.png)

直感的に理解しやすい例なので、特に説明がなくとも2進数を10進数として表示できていることが分かると思います。「7セグメントLED」などのワードで検索すれば色々と出てきます。

<h2>最後に</h2>

素人なりに勉強して書きましたが、間違った記述があれば訂正するので教えて下さい。
長くなりましたが、最後まで読んで下さってありがとうございました。