Dev Study
← コンピュータの仕組み
レッスン 3 / 13·約 13 分·第1期 コンピュータ単体の仕組み

論理回路から演算へ — AND・OR・XOR の組み合わせで足し算ができる

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP
  3. ルータ経路選択
  4. ロードバランサ振り分け
  5. Nginx受け口
  6. アプリ処理今ここ
  7. DB保存

前回、0と1の並びで数を表せることを確認しました。今回はその0と1を使って、実際に計算をする回路を組み立てます。第1期でいちばん「機械の中身」に近い回です。

まず結論

コンピュータは足し算の方法を「知って」いるわけではありません。ANDとORとXORという単純な部品を組み合わせると、結果的に足し算になる回路ができあがります。

つまり計算とは、賢い装置が考えているのではなく、電気の通り道の形が答えを決めている、ということです。

? 読む前に予測

1ビットの足し算 1 + 1 を考えます。答えは2ですが、1ビットでは2を表せません。回路はどう対処するでしょうか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

部品は3種類だけ覚えればいい

前回、0と1で数が表せることを見ました。では、その0と1を使って実際に計算するにはどうすればいいのでしょうか。

必要な部品は驚くほど単純です。入力を受け取って出力を返す、小さな回路が数種類あるだけです。

  • AND — 入力が両方とも1のときだけ1を出す
  • OR — 入力のどちらかが1なら1を出す
  • XOR — 入力が片方だけ1のとき1を出す(両方1なら0)

これだけです。この3つを組み合わせると、足し算ができる回路が組み上がります。しかも、足し算をしようと思って作った部品ではないという点が面白いところです。

具体実物

1ビットの足し算を書き出してみる

いきなり回路を考えるのではなく、まずやりたいことを書き出します。1ビット同士の足し算は4通りしかありません。

1ビットの足し算(実際に計算して確認済み)表
A B | 答え この桁 繰り上がり
0 0 | 0 0 0
0 1 | 1 1 0
1 0 | 1 1 0
1 1 | 2 0 1 ← 2は1ビットで表せないので繰り上げる

1 + 1 = 2 だけが特別です。1ビットでは2を表せないので、**「この桁は0、繰り上がりが1」**と分けて出力します。筆算で繰り上がりを上に小さく書くのと同じです。

ここで、右の2列をそれぞれ眺めてみてください。

  • 繰り上がりの列(0, 0, 0, 1)は、両方1のときだけ1 ——これは AND そのものです
  • この桁の列(0, 1, 1, 0)は、片方だけ1のとき1 ——これは XOR そのものです
✓ ここまでの確認

1ビットの足し算で「繰り上がり」が発生するのはどの場合ですか。

抽象原理

論理の部品が、そのまま計算になる

ここが今回の核心です。私たちは「足し算をする装置」を設計しようとしました。ところが書き出してみたら、既にある論理の部品(ANDとXOR)の動作と一致していたのです。

半加算器 — ANDとXORを並べるだけ
入力 A0 か 1
入力 B0 か 1
同じ2本の入力を、2つの部品に同時に流す
XOR片方だけ1なら1
AND両方1なら1
それぞれの出力が
Sumこの桁の答え
Carry繰り上がり
  • ・部品はたった2つ。これで1ビットの足し算が完成する
  • ・「計算の手順」はどこにも記憶されていない。配線の形が答えを決めている

この回路を半加算器と呼びます。「半」なのは、下の桁からの繰り上がりを受け取れないからです。実際の筆算では、下の桁から繰り上がってきた1も足す必要があります。

入力が3つ(A、B、下からの繰り上がり)になったものを全加算器と呼びます。こちらが実際に使われる部品です。

具体実物

全加算器の動作を全パターン確認する

入力が3つなので、組み合わせは8通りです。すべて書き出して、本当に正しく足せているか検算します。

全加算器の真理値表(全8通り・実際に計算して検算済み)表
A B Cin | Sum Cout | 2進で読むと 実際の和
0 0 0 | 0 0 | 00 = 0 0 OK
0 0 1 | 1 0 | 01 = 1 1 OK
0 1 0 | 1 0 | 01 = 1 1 OK
0 1 1 | 0 1 | 10 = 2 2 OK
1 0 0 | 1 0 | 01 = 1 1 OK
1 0 1 | 0 1 | 10 = 2 2 OK
1 1 0 | 0 1 | 10 = 2 2 OK
1 1 1 | 1 1 | 11 = 3 3 OK

8通りすべてで、出力を2桁の2進数として読むと入力の和と一致しています。部品を組み合わせただけで、確かに足し算になっています。

✓ ここまでの確認

「半加算器」が「半」と呼ばれるのはなぜですか。

抽象原理

並べれば、何桁でも計算できる

1ビットぶんの部品ができれば、あとは並べるだけです。

全加算器を8個並べ、それぞれの繰り上がり出力を隣の桁の繰り上がり入力につなぐと、最も単純な形の8ビット加算器になります。筆算で下の桁から順に繰り上がりを送っていくのと、全く同じ構造です。

8ビット加算器 — 繰り上がりが右から左へ伝わる
第0ビット全加算器 → Cout○ 第1ビットへ
第1ビットCin を受け取り → Cout○ 第2ビットへ
…同じものが並ぶ○ 順に伝わる
第7ビット最後の Cout○ 桁あふれの印
↓
同じ部品を8個並べるだけで8ビットの足し算ができる
  • ・最後の Cout が1なら、8ビットに収まらなかった=桁あふれ(前回のオーバーフロー)
  • ・繰り上がりが端から端まで伝わるのを待つ必要があり、これが回路の遅さの原因になる

そして最後の桁から出てきた繰り上がりは、前回学んだ桁あふれそのものです。8ビットの箱に収まらなかったことを示す信号が、ちゃんと回路から出てきます。

この章のまとめ

  • 必要な部品は AND・OR・XOR といった単純な論理回路だけ。
  • 1ビットの足し算を書き出すと、繰り上がりはAND、答えの桁はXORと完全に一致する。足し算用に作った部品ではないのに、結果的に足し算になる。
  • 半加算器は下からの繰り上がりを受け取れない。3入力にしたものが全加算器で、これが実用される。
  • 全加算器を並べて繰り上がりを隣へ渡せば、何桁でも計算できる。最後の繰り上がりが桁あふれの印。
  • CPUは計算手順を知っているのではなく、そういう形に配線されているだけ。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

環境:

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 4正解: 0

AND回路(両方1のときだけ1を出す)は、半加算器のどの出力に対応しますか。

用語集(5語)
論理回路
0と1の入力を受け取って0か1を出力する回路。AND・OR・NOT・XORなどの種類がある。組み合わせることであらゆる計算を実現する。
AND / OR / NOT / XOR
AND=両方1のとき1。OR=どちらかが1なら1。NOT=0と1を反転。XOR=片方だけが1のとき1(排他的論理和)。
真理値表
入力のすべての組み合わせに対して、出力がどうなるかを書き並べた表。回路の動作を完全に記述できる。
半加算器 / 全加算器
半加算器=2つのビットを足す回路(SumとCarryを出力)。全加算器=下の桁からの繰り上がりも含めて3つを足す回路。全加算器を並べると多桁の加算ができる。
ALU (演算論理装置)
CPUの中で実際に計算を行う部分。加算器を含み、足し算・引き算・論理演算などを担当する。