計算の実現:加算器
AND、OR、NOTといった論理回路は、単なる「条件の判定」を行う回路でした。しかし、これらを適切に繋ぎ合わせることで、驚くべきことにコンピュータに「算術計算」を行わせることができます。ここでは、2進数の足し算を実現する「半加算器」と「全加算器」の設計を通じて、論理から計算が生まれるメカニズムを紐解きます。
1. 2進数1桁の足し算ルール
もっともシンプルな足し算として、2進数1桁の計算(1ビット + 1ビット)を考えてみましょう。 パターンは以下の4通りしかありません。
0 + 0 = 00(和は0、繰り上がりは0)0 + 1 = 01(和は1、繰り上がりは0)1 + 0 = 01(和は1、繰り上がりは0)1 + 1 = 10(和は0、繰り上がりは1)
この結果を、「和(S:Sum)」の桁と、上の桁への「繰り上がり(C:Carry)」の桁に分けて真理値表に整理してみます。
| 入力A | 入力B | 繰り上がり(C) | 和(S) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
この表の「出力」の列をよく観察してください。
- 和(S)の列は、AとBが異なるときに 1 になっています。これはまさにXORゲートの動作です。
- 繰り上がり(C)の列は、AとBが両方 1 のときだけ 1 になっています。これはまさにANDゲートの動作です。
2. 半加算器(Half Adder)の設計
この観察結果から、1ビットのXORゲートと1ビットのANDゲートを並列に繋ぐだけで、2進数1桁の足し算ができる回路が完成します。この回路を半加算器(Half Adder)と呼びます。
3. なぜ「半(Half)」加算器なのか?
半加算器は1桁の計算には十分ですが、2桁以上の足し算を行おうとすると問題が発生します。 私たちが筆算で足し算をするとき、「下の桁から繰り上がってきた値」も一緒に足す必要があります。
しかし、半加算器には入力端子が「A」と「B」の2つしかありません。つまり、下の桁からの繰り上がり数(C_in)を入力として受け取ることができないのです。 下の桁からの繰り上がりを加算できないため、これだけでは「半分」の機能しか満たしていないという意味で、「半加算器」と呼ばれます。
4. 全加算器(Full Adder)の設計
下の桁からの繰り上がり(C_in)も含めた、3つの入力(A, B, C_in)の足し算を行うことができる回路を全加算器(Full Adder)と呼びます。
全加算器は、「2つの半加算器」と「1つのORゲート」を組み合わせることで作ることができます。
- まず、1つ目の半加算器で
A + Bを計算します。 - その結果(和)と、下の桁からの繰り上がり
C_inを、2つ目の半加算器に入力して足し合わせます。これで最終的な和(S)が求まります。 - 1つ目の半加算器で発生した繰り上がり、あるいは2つ目の半加算器で発生した繰り上がりの「どちらか一方」でも 1 であれば、次の桁への繰り上がり(C_out)を 1 にします(ORゲートで統合)。
5. 多ビットへの拡張:リップルキャリー加算器
全加算器が1つあれば、「繰り上がりを考慮した1桁の足し算」ができます。 では、4ビットや8ビット、さらには現代のコンピュータのような32ビットや64ビットの足し算を行うにはどうすればよいでしょうか?
答えは簡単です。「全加算器を桁の数だけ横に繋げて、繰り上がり出力(C_out)を隣の全加算器の繰り上がり入力(C_in)へ数珠繋ぎ(チェーン)にする」だけです。
このように設計された加算器をリップルキャリー加算器(Ripple Carry Adder)と呼びます。 「リップル(漣:さざなみ)」という名がついているのは、繰り上がり信号が下の桁から上の桁へと、水面に広がる波紋のように順番に伝わっていくためです。
このシンプルな構造により、どれだけ桁数が増えても、論理ゲートの力だけで自動的に瞬時に足し算を行うことができるようになります。
次のセクションでは、足し算だけではなく、コンピュータがデータを「記憶」しておくための回路(メモリの起源)について学びます。