読む前にこの記事のポイントを音声で確認できます。この音声は本記事をもとにAIツール(NotebookLM)で自動生成したもので、発音や言い回しが不自然な箇所や、内容の誤りが含まれる可能性があります。理解の補助としてご利用ください。
「1 + 1 = 2」という当たり前の計算を、コンピューターはどうやって実行しているのでしょうか。コンピューターの中にあるのは「電気が流れているか、流れていないか」の2通りだけです。数字も文字も画像も音も、すべて 0 と 1 の並びに置き換えて処理しています。
この記事では、コンピューターが足し算をする仕組みのいちばん基礎にあたる「半加算器(Half Adder)」という回路を、初心者向けに説明します。最後に、半加算器をブラウザで動かせる Web アプリも紹介します。
- 2 進数とブール代数、論理ゲート(AND、OR、XOR)の基本
- 半加算器が XOR と AND の2つのゲートで足し算をする仕組み
- 全加算器へのつながりと、オーバーフロー(桁あふれ)
コンピューターの世界は「0」と「1」だけ
コンピューターの内部では、すべての情報を 2 進数(バイナリ)で表します。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)という数学の一分野です。19 世紀の数学者ジョージ・ブールが考えたもので、「真(True / 1)」と「偽(False / 0)」の2つの値だけを扱い、それらを組み合わせて新しい結果を導きます。
「傘を持っていく」のは、「雨が降っている」かつ「外出する」ときだけ。雨が降っていなければ、あるいは外出しなければ、傘は持っていきません。両方の条件を満たしたときだけ「真(持っていく)」になります。
この「かつ」の部分が、ブール代数の演算にあたります。条件の組み合わせから結論を導くこのルールを、コンピューターは電気回路で実現しています。ブール代数をスイッチの回路に当てはめられることは、1930 年代後半にクロード・シャノンが示しました。それを担う部品が、次の論理ゲートです。
論理ゲート ― コンピューターの「考える部品」
論理ゲートは、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 |
OR ゲート(論理和)
どちらか一方でも 1 なら 1 を出力します。半加算器では使いませんが、後で出てくる全加算器で使います。
| A | B | A OR B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
XOR ゲート(排他的論理和)
どちらか一方だけが 1 のときに 1 を出力し、両方 1 だと 0 になります。OR と似ていますが、両方 1 のときに 0 になるのがポイントです。「A と B が違う値のときだけ 1 になる」とも言えます。この性質が、足し算で活躍します。
| A | B | A XOR B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
足し算は AND と XOR でできる
ここからが本題です。2 進数で「1 桁 + 1 桁」の足し算を、すべてのパターンで書き出してみます。
| A | B | A + B(2 進数) | 10 進数 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 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 の表とまったく同じです。つまり、1 桁 + 1 桁の足し算は、次の2つの論理ゲートだけで表せます。
| 出力 | 求め方 |
|---|---|
| Sum(和、下の桁) | A XOR B |
| Carry(桁上がり、上の桁) | A AND B |
これが「半加算器(Half Adder)」
XOR で和を、AND で桁上がりを求めるこの回路が、半加算器(Half Adder)です。入力 A と B は、それぞれ XOR ゲートと AND ゲートの両方に入ります。
「1 + 1 = 2」を半加算器で追ってみる
A = 1、B = 1 を入れたときの動きを、順番に追ってみます。
| 順番 | ゲート | 計算 | 結果 |
|---|---|---|---|
| 1 | 入力 | A = 1、B = 1 | ― |
| 2 | XOR | 1 XOR 1 = 0 | Sum は 0 |
| 3 | AND | 1 AND 1 = 1 | Carry は 1 |
| 4 | 並べる | Carry(上の桁)、Sum(下の桁)の順 | 10(2 進数)= 10 進数の 2 |
これが、コンピューターが「1 + 1 = 2」を計算している瞬間です。XOR と AND という2つの単純なゲートを組み合わせるだけで、足し算が成り立っています。
なぜ「半」加算器なのか
半加算器が「半(Half)」と呼ばれるのは、下の桁からの桁上がりを受け取る入力がないからです。1 桁目の足し算はこれでできますが、2 桁目からは A と B に加えて、下の桁から繰り上がってきた値(Carry in)も足す必要があります。
この3つの入力を足せる回路が、全加算器(Full Adder)です。全加算器は、半加算器を2つと OR ゲートを1つ組み合わせて作れます。
全加算器を桁の数だけ並べ、各桁の Carry out を次の桁の Carry in につなぐと、8 ビットや 64 ビットといった大きな数の足し算ができます(このつなぎ方をリップルキャリー加算器と呼びます)。8 ビットなら 0〜255 の 256 通りの数を扱えます。実際の CPU では、桁上がりを速く求めるための工夫(キャリー先読み加算器など)も使われますが、土台にあるのは同じ考え方です。半加算器は、コンピューターの計算のいちばん根っこにある部品と言えます。
ちょっとした罠 ― オーバーフロー
コンピューターは XOR と AND で足し算ができることが分かりました。ただし、コンピューターには苦手なこともあります。それがオーバーフロー(桁あふれ)です。
たとえば「1 桁分しか保存できない箱」に 1 + 1 の結果を入れようとすると、答えの「10」は2桁なので入りきりません。上の桁(Carry)が箱からはみ出して捨てられ、「1 + 1 なのに答えが 0」という結果になります。桁数が増えても同じで、8 ビットの箱では 255 + 1 の答えが 0 になります(0〜255 を扱う符号なしの場合)。
| 箱の大きさ | 計算 | 本当の答え(2 進数) | 箱に残る値 |
|---|---|---|---|
| 1 ビット | 1 + 1 | 10 | 0 |
| 8 ビット | 255 + 1 | 1 0000 0000 | 0000 0000(0) |
オーバーフローは、現実のシステムでも問題を起こしています。
- ボーイング 787 では、発電機制御ユニットのソフトウェアのカウンタが 248 日間の連続通電でオーバーフローし、すべての交流電源を失うおそれがあるとして、2015 年に米国連邦航空局(FAA)が耐空性改善命令を出しました。
- アーケードゲームの「パックマン」では、整数のオーバーフローが原因で 256 面が正しく表示されず、クリアできなくなります。
コンピューターは万能に見えて、保存できる桁数の上限には常に縛られています。
実際に体験してみよう
ブラウザ上で半加算器を動かせる Web アプリを用意しました。次のことができます。
- A と B のスイッチを切り替えて、入力を変える
- 「クロック投入」ボタンで信号を回路に流す
- XOR ゲート、AND ゲートを通って結果が出てくる様子を見る
- 真理値表(この記事の表)が、入力に合わせてハイライトされる
- 「1 + 1 = 2」のプリセットで、すぐに試せる
- オーバーフローも再現できる
手を動かしてから、もう一度この記事を読み返すと、理解が深まると思います。
まとめ
| 項目 | ポイント |
|---|---|
| 2 進数 | コンピューターは 0 と 1 の 2 進数ですべての計算をしている |
| ブール代数 | 真(1)と偽(0)の2つの値を扱う数学のルール |
| 論理ゲート | ブール代数の基本演算(AND、OR、XOR など)を電気回路で実現した部品 |
| 半加算器 | 1 桁 + 1 桁の足し算をする回路。XOR で和(Sum)、AND で桁上がり(Carry)を求める |
| 全加算器 | 下の桁からの桁上がりも足せる回路。半加算器2つと OR ゲートで作れる |
| 多桁の足し算 | 全加算器を並べて桁上がりをつなぐと、8 ビットや 64 ビットの足し算になる |
| オーバーフロー | 答えが保存できる桁数を超えると、上の桁が捨てられる |
電卓もスマホもスーパーコンピューターも、突き詰めれば、こうした論理ゲートの組み合わせを膨大な数だけ集めてできています。もっと知りたくなった方は、次は全加算器、そして CPU の ALU(算術論理演算装置)へと進んでみてください。
コメント