➕🔢⚡
コンピュータの設計

4ビット加算器

コンピュータはどうやって「足し算」をするのか?

AND・OR・XOR ゲートを組み合わせるだけで、数を足せる回路が作れる。
半加算器 → 全加算器 → 4ビット RCA へと積み上げる仕組みを体験しよう。

⏱ 所要:25–35分 難易度:★★☆ 前提:論理ゲートの基礎
Step 1

2進数の「足し算」のルール

まず手計算で感覚をつかもう

0+0
= 0
桁上がりなし
0+1
= 1
桁上がりなし
1+0
= 1
桁上がりなし
1+1
= 10
← 桁上がり発生!

💡 「1+1=10」とはどういうこと?

10進数で「9+1=10」になると一桁上がるように、2進数では 「1+1=10(二進数)」 で桁が上がる。
この「上の桁に1を持ち越す」ことを 桁上がり(キャリー / Carry) と呼ぶ。 加算器の設計はこの「桁上がりをどう扱うか」が全てのポイントだ。

📐 複数桁の足し算例:5 + 3 = 8

10 進数
  5
+ 3
= 8
2 進数(4ビット)
桁上がり: 1 0 0 0
 0 1 0 1
+ 0 0 1 1
= 1 0 0 0
0101₂ + 0011₂ = 1000₂ = 8₁₀

2進数の足し算も、右(LSB)から順に1桁ずつ計算して、桁上がりを左隣の桁に伝えていく。
この「桁上がりが順番に波のように伝わる」動作が リップルキャリー(Ripple Carry) の由来だ。

Step 2

半加算器(Half Adder)

1ビット + 1ビット を計算する最小の回路

仕組みを分解する

S
Sum(和)の出力
「片方だけが 1」のとき和が 1。両方 0 や両方 1 では和は 0。
→ これは XOR ゲート の動作と完全一致!
S = A ⊕ B
C
Carry(桁上がり)の出力
桁上がりが起きるのは「両方が 1」のときだけ。
→ これは AND ゲート の動作と完全一致!
C = A · B

半加算器の内部構造(XOR + AND)

XOR AND A B S(和) C(桁上がり)

真理値表(行をクリックで確認)

A B S(和) C(桁上がり)
0000
0110
1010
1101

▶ 自分で試す

入力 A
入力 B
=
Sum S
0
Carry C
0

🤔 なぜ「半」加算器?  2つのビットを足せるが、前の桁からの 桁上がり入力(Cin)を受け取れない。 複数桁の計算では「前の桁から来たキャリーも一緒に足す必要がある」—— それが次の「全加算器」だ。

Step 3

全加算器(Full Adder)

前の桁からのキャリーも受け取れる「完全な」1ビット加算器

半加算器 ×2 で作れる!

全加算器は 半加算器を2つOR ゲート1つ で構成できる。

  1. まず A と B を半加算器1で計算 → 中間の Sum₁ と Carry₁
  2. 次に Sum₁ と Cin を半加算器2で計算 → 最終 S と Carry₂
  3. Carry₁ OR Carry₂ = Cout(最終桁上がり)
論理式
S = A ⊕ B ⊕ Cin
Cout = (A·B) | (B·Cin) | (A·Cin)

全加算器の内部構造(HA×2 + OR)

HA₁ HA₂ OR A B S₁ Cin C₁ C₂ S Cout

真理値表(8通り)

ABCin SCout
00000
00110
01010
01101
10010
10101
11001
11111

▶ 3入力で試す

A
B
Cin
=
Sum S
0
Cout
0
Step 4

4ビット RCA の構造

全加算器を4つ並べると 4ビット加算器の完成

��️

構成部品

全加算器(FA)× 4
各ビット(bit0〜bit3)を担当

🌊

リップル伝搬

bit0 の Cout が bit1 の Cin へ…
キャリーが波のように伝わる

📊

表現範囲

0〜15 の計算が可能
Cout で 16〜31 も検出

⚡ キャリー伝搬の流れ

初期
Cin=0
bit 0 (LSB)
FA [0]
A₀+B₀+Cin
↓ Cout
bit 1
FA [1]
A₁+B₁+C₀
↓ Cout
bit 2
FA [2]
A₂+B₂+C₁
↓ Cout
bit 3 (MSB)
FA [3]
A₃+B₃+C₂
↓ Cout
オーバーフロー
Cout final
Step 5 — インタラクティブ

4ビット RCA シミュレータ

キャリーが波のように伝わる様子をアニメで観察しよう

入力の設定 左が MSB

A
= 0
B
= 0
(通常は 0)

計算結果

A(10進)
0
B(10進)
0
Sum S(2進)
0000
最終 Cout
0
合計(10進)
0
状態:

📋 キャリー伝搬ログ

A と B を設定して Step / Play を実行してください

RCA の限界:なぜ遅い?

現代の CPU が使わない理由を理解しよう

⏱️ RCA の問題点

RCA では bit0 の計算が終わって初めて bit1 が計算できる。bit1 が終わって初めて bit2 へ…という 直列依存 がある。 32ビット加算器なら 32段のゲート遅延が積み重なる。ナノ秒単位でも、GHz 動作の CPU にとっては致命的に遅い。

遅延 ∝ N(ビット数)
線形に増加

🚀 解決策:桁上げ先見(CLA)

Carry-Lookahead Adder(CLA) は各ビットのキャリーを「待たずに」先に計算できる。 Generate(G)と Propagate(P)という概念でキャリーを並列計算する。 現代の CPU の ALU はほぼ CLA ベースだ。

遅延 ∝ log₂(N)
対数的に改善

🗺️ 加算器の種類まとめ

種類 遅延 回路規模 主な用途
半加算器 (HA)最小2ゲート1ビット加算
全加算器 (FA)5ゲートRCA の基本単位
リップルキャリー (RCA)O(N)FA × N教育・小規模回路
桁上げ先見 (CLA)O(log N)現代の CPU