読む前にパッと耳で!この記事のポイント、サクッと音声でお届け
このポッドキャスト音声は、本記事をもとに、AIツール(NotebookLM)を用いて自動生成したものです。発音や言い回しに不自然な点や、内容に誤りが含まれる可能性があります。あくまで「理解の補助」としてご活用いただけますと幸いです。
はじめに
「1 + 1 = 2」。
私たちが当たり前に使っているこの計算を、コンピューターはどうやって実行しているのでしょうか?
電卓のキーを叩けば一瞬で答えが出ますし、スマホで電気代を計算するのも瞬時です。でも、コンピューターの中身は結局のところ「電気が流れているか/流れていないか」だけの世界です。数字も、文字も、画像も、音も、すべて「0」と「1」のパターンに置き換えられて処理されています。
では、「電気が ON か OFF か」という 2 通りしかない世界で、どうやって「1 + 1 = 2」を計算しているのでしょう?
この記事では、コンピューターが足し算をする仕組みのいちばん基礎にあたる 「半加算器(Half Adder)」 という回路を、初心者の方向けにできるだけやさしく解説します。読み終わる頃には、「あ、コンピューターって意外と単純な仕組みでできてるんだ」と感じてもらえるはずです。
最後には、実際に半加算器を動かして体験できる Web アプリも紹介しますので、ぜひ最後まで読んでみてください。
実際に体験してみよう 🚀
以下の記事を読んで、理屈はだいたい分かったよ、という方のために、実際にブラウザ上で半加算器を動かせる Web アプリ を用意しました。
- A と B のスイッチを切り替えて入力を変える
- 「クロック投入」ボタンで信号を回路に流す
- XOR・AND ゲートを通って結果が出てくる様子を可視化
- 真理値表(さっきの表)が同期してハイライトされる
- 「1 + 1 = 2」のプリセットで一瞬で体験
- オーバーフロー も再現できるので、桁あふれの怖さも体感できます
ぜひ手を動かしながら、コンピューターが足し算をする「現場」を覗いてみてください。 読み終わった後にもう一度この記事を読み返すと、きっと理解がぐっと深まるはずです。
コンピューターの世界は「0」と「1」だけ
まずは大前提のお話です。
コンピューターの内部では、すべての情報が 2 進数(バイナリ) で表現されます。これは「0 と 1 の 2 種類の数字だけで数を表す」やり方です。
私たちが普段使っているのは 10 進数で、0〜9 の 10 種類の数字を使い、9 の次は桁が上がって「10」になりますね。
2 進数は、0 と 1 だけしかないので、1 の次にはもう桁が上がって「10」になります。
| 10進数 | 2進数 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 2 | 10 |
| 3 | 11 |
| 4 | 100 |
| 5 | 101 |
つまりコンピューターの世界では、「1 + 1」の答えは「10」(2 進数で 2 を意味する) になるわけです。
なぜ 2 進数を使うのか?それは、電気回路にとって「ON / OFF」(電圧が高い/低い)という 2 つの状態を扱うのが、いちばんシンプルで誤りが少ないからです。10 段階の電圧を区別するより、2 段階だけ判別する方がずっと確実なのです。
「論理」で計算する ― ブール代数とは?
コンピューターはこの 0 と 1 を、ただ保存するだけではなく 「計算」 します。その計算の土台になっているのが ブール代数(Boolean Algebra) という数学の一分野です。
難しそうな名前ですが、考え方はとてもシンプル。
ブール代数では、「真(True / 1)」と「偽(False / 0)」の 2 つの値だけを扱い、それらを組み合わせて新しい結果を導き出します。
例えば日常生活で考えてみましょう。
「傘を持っていく」のは、**「雨が降っている」かつ「外出する」**ときだけ。
この「かつ」の部分がブール代数の演算にあたります。雨が降っていなければ、あるいは外出しなければ、傘は持っていきません。両方の条件が満たされたときだけ「真(持っていく)」になるわけです。
このように、「条件の組み合わせから結論を導く」 ルールを、コンピューターは電気回路で実現しています。それを担うのが、次にお話しする 論理ゲート です。
論理ゲート ― コンピューターの「考える部品」
論理ゲートとは、0 と 1 の入力を受け取って、ルールに従って 0 か 1 の答えを出す小さな部品のことです。
ここでは半加算器を理解するために必要な、3 つの基本ゲートを紹介します。
AND ゲート(論理積)
両方とも 1 のときだけ 1 を出力する。
| A | B | A AND B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
「A も B も両方 1 なら 1」というシンプルなルールです。さきほどの「雨が降ってかつ外出する」のような関係ですね。
OR ゲート(論理和)
どちらか一方でも 1 なら 1 を出力する。
| A | B | A OR B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
「A または B のどちらかが 1 なら 1」。今回の半加算器では使いませんが、よく登場する基本ゲートなので覚えておくと便利です。
XOR ゲート(排他的論理和)
どちらか一方だけが 1 のときに 1 を出力する。両方 1 だと 0 になる。
| A | B | A XOR B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
XOR は少し特殊です。OR と似ていますが、「両方とも 1 のときは 0 になる」 のがポイント。「A と B が違う値のときだけ 1 になる」とも言えます。
このちょっと変わった性質が、足し算で大活躍します。
ここで気づく ― 「足し算」って AND と XOR でできるんじゃない?
さて、ここから本題です。
2 進数で「1 桁 + 1 桁」の足し算をすべてのパターンで書き出してみましょう。
| A | B | A + B(2進数) | 結果の意味 |
|---|---|---|---|
| 0 | 0 | 0 | 0(10進: 0) |
| 0 | 1 | 1 | 1(10進: 1) |
| 1 | 0 | 1 | 1(10進: 1) |
| 1 | 1 | 10 | 2(10進: 2) |
ここで結果を 「下の桁(1 の位)」 と 「上の桁(桁上がり)」 に分けて見てみます。
| A | B | 下の桁(Sum) | 上の桁(Carry) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
何か気づきませんか?
🤔 下の桁(Sum) … これ、さっきの XOR の表とまったく同じです! 🤔 上の桁(Carry) … これ、さっきの AND の表とまったく同じです!
つまり、
- Sum(和)= A XOR B
- Carry(桁上がり)= A AND B
という、たった 2 つの論理ゲートだけで、1 桁 + 1 桁の足し算が完全に表現できてしまうのです。
これが「半加算器(Half Adder)」
この 「XOR で和を、AND で桁上がりを計算する回路」 が、まさに 半加算器(Half Adder) です。
回路の流れを図にするとこうなります。
flowchart LR
A[入力 A] --> XOR[XOR ゲート]
B[入力 B] --> XOR
A --> AND[AND ゲート]
B --> AND
XOR --> S[Sum<br/>和(下の桁)]
AND --> C[Carry<br/>桁上がり(上の桁)]
classDef default fill:#BBD4F0,stroke:#1F4E79,stroke-width:1.5px,color:#0B2545
classDef decision fill:#FFE699,stroke:#806000,stroke-width:1.5px,color:#0B2545
class C decision「1 + 1 = 2」を半加算器で追ってみる
A = 1、B = 1 を入れたときを順番に追ってみましょう。
- 入力 A = 1、入力 B = 1
- XOR ゲート: 1 XOR 1 = 0 → Sum は 0
- AND ゲート: 1 AND 1 = 1 → Carry は 1
- 結果を上下に並べると 「10」(2 進数)= 10進数の 2 🎉
これがまさに、コンピューターが「1 + 1 = 2」を計算している瞬間です。
魔法でも何でもなく、XOR と AND という 2 つの単純なゲートを組み合わせただけで、足し算が成立しているわけですね。
なぜ「半」加算器なのか?
「半(Half)」と付いているのは、1 桁分の足し算しかできないからです。
桁数が増えると、「下の桁から繰り上がってきた数(Carry In)」も足さなければなりません。それを処理できるように半加算器を 2 つ組み合わせたものが 「全加算器(Full Adder)」 で、さらにそれを並べていけば、8 ビット(256 通り) や 64 ビットの大きな数の足し算もできるようになります。
つまり半加算器は、コンピューターのすべての計算の いちばん根っこにあるパーツ なのです。
ちょっとした罠 ― オーバーフロー
ここまでで「コンピューターは XOR と AND で足し算できる」ということが分かりました。でも実は、コンピューターには 苦手なこと もあります。
それが オーバーフロー(桁あふれ) です。
たとえば、「1 桁分しか保存できない箱」に 1 + 1 の結果を入れようとすると、答えは「10」で 2 桁になってしまいますよね。すると上の桁(Carry)が 箱からはみ出して、捨てられてしまう ことがあるのです。
その結果、「1 + 1 なのに、答えが 0 になる」 という奇妙な現象が起きます。
これは現実のシステムでも問題になっていて、過去には飛行機の制御システムや有名なゲームのバグの原因にもなっています。コンピューターは万能に見えて、「保存できる桁数の上限」 には常に縛られているのです。
このあたりも、添付の Web アプリで実際に体験できますので、ぜひ試してみてください。
まとめ
長くなりましたが、要点を整理します。
- コンピューターは 0 と 1 の 2 進数 ですべての計算をしている。
- 0 と 1 を扱う数学のルールが ブール代数。
- ブール代数の基本演算を電気回路で実現したのが 論理ゲート(AND、OR、XOR など)。
- 1 桁 + 1 桁の足し算は、XOR で和、AND で桁上がりを計算するだけで実現できる。
- この回路が 半加算器(Half Adder) で、コンピューターの計算の最も基本となるパーツ。
- 半加算器を組み合わせていくことで、全加算器、そして 64 ビットの大規模な計算へとつながっていく。
「1 + 1 = 2」という当たり前の計算の裏側には、こうした 論理の積み重ね があります。
電卓もスマホもスーパーコンピューターも、突き詰めればこの半加算器のような小さな仕組みが何億個も並んでいるだけ、と考えると、なんだか少し親近感が湧いてきませんか?
この記事を読んで「もっと知りたい!」と思った方は、次は 全加算器、そして CPU の ALU(算術論理演算装置) へと進んでみてください。コンピューターの世界が、ぐっと近く感じられるようになるはずです。
コメント