コンピュータはどうやって「足し算」をするのか?
AND・OR・XOR ゲートを組み合わせるだけで、数を足せる回路が作れる。
半加算器 → 全加算器 → 4ビット RCA へと積み上げる仕組みを体験しよう。
まず手計算で感覚をつかもう
10進数で「9+1=10」になると一桁上がるように、2進数では 「1+1=10(二進数)」 で桁が上がる。
この「上の桁に1を持ち越す」ことを 桁上がり(キャリー / Carry) と呼ぶ。
加算器の設計はこの「桁上がりをどう扱うか」が全てのポイントだ。
2進数の足し算も、右(LSB)から順に1桁ずつ計算して、桁上がりを左隣の桁に伝えていく。
この「桁上がりが順番に波のように伝わる」動作が リップルキャリー(Ripple Carry) の由来だ。
1ビット + 1ビット を計算する最小の回路
半加算器の内部構造(XOR + AND)
| A | B | S(和) | C(桁上がり) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
🤔 なぜ「半」加算器? 2つのビットを足せるが、前の桁からの 桁上がり入力(Cin)を受け取れない。 複数桁の計算では「前の桁から来たキャリーも一緒に足す必要がある」—— それが次の「全加算器」だ。
前の桁からのキャリーも受け取れる「完全な」1ビット加算器
全加算器は 半加算器を2つ と OR ゲート1つ で構成できる。
全加算器の内部構造(HA×2 + OR)
| A | B | Cin | S | Cout |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
全加算器を4つ並べると 4ビット加算器の完成
全加算器(FA)× 4
各ビット(bit0〜bit3)を担当
bit0 の Cout が bit1 の Cin へ…
キャリーが波のように伝わる
0〜15 の計算が可能
Cout で 16〜31 も検出
キャリーが波のように伝わる様子をアニメで観察しよう
現代の CPU が使わない理由を理解しよう
RCA では bit0 の計算が終わって初めて bit1 が計算できる。bit1 が終わって初めて bit2 へ…という 直列依存 がある。 32ビット加算器なら 32段のゲート遅延が積み重なる。ナノ秒単位でも、GHz 動作の CPU にとっては致命的に遅い。
Carry-Lookahead Adder(CLA) は各ビットのキャリーを「待たずに」先に計算できる。 Generate(G)と Propagate(P)という概念でキャリーを並列計算する。 現代の CPU の ALU はほぼ CLA ベースだ。
| 種類 | 遅延 | 回路規模 | 主な用途 |
|---|---|---|---|
| 半加算器 (HA) | 最小 | 2ゲート | 1ビット加算 |
| 全加算器 (FA) | 小 | 5ゲート | RCA の基本単位 |
| リップルキャリー (RCA) | O(N) | FA × N | 教育・小規模回路 |
| 桁上げ先見 (CLA) | O(log N) | 大 | 現代の CPU |