1 + 1 はなぜ 2 になる? ― コンピューターが足し算する仕組みを「半加算器」から覗いてみる

音声で聞く

読む前にこの記事のポイントを音声で確認できます。この音声は本記事をもとにAIツール(NotebookLM)で自動生成したもので、発音や言い回しが不自然な箇所や、内容の誤りが含まれる可能性があります。理解の補助としてご利用ください。

「1 + 1 = 2」という当たり前の計算を、コンピューターはどうやって実行しているのでしょうか。コンピューターの中にあるのは「電気が流れているか、流れていないか」の2通りだけです。数字も文字も画像も音も、すべて 0 と 1 の並びに置き換えて処理しています。

この記事では、コンピューターが足し算をする仕組みのいちばん基礎にあたる「半加算器(Half Adder)」という回路を、初心者向けに説明します。最後に、半加算器をブラウザで動かせる Web アプリも紹介します。

この記事でわかること
  1. 2 進数とブール代数、論理ゲート(AND、OR、XOR)の基本
  2. 半加算器が XOR と AND の2つのゲートで足し算をする仕組み
  3. 全加算器へのつながりと、オーバーフロー(桁あふれ)

コンピューターの世界は「0」と「1」だけ

コンピューターの内部では、すべての情報を 2 進数(バイナリ)で表します。2 進数は、0 と 1 の2種類の数字だけで数を表す方法です。

普段使っている 10 進数は、0〜9 の10種類の数字を使い、9 の次で桁が上がって「10」になります。2 進数は 0 と 1 しかないので、1 の次でもう桁が上がり「10」になります。

10 進数2 進数
00
11
210
311
4100
5101

つまりコンピューターの世界では、「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 を出力します。さきほどの「雨が降っている、かつ外出する」のような関係です。

ABA AND B
000
010
100
111

OR ゲート(論理和)

どちらか一方でも 1 なら 1 を出力します。半加算器では使いませんが、後で出てくる全加算器で使います。

ABA OR B
000
011
101
111

XOR ゲート(排他的論理和)

どちらか一方だけが 1 のときに 1 を出力し、両方 1 だと 0 になります。OR と似ていますが、両方 1 のときに 0 になるのがポイントです。「A と B が違う値のときだけ 1 になる」とも言えます。この性質が、足し算で活躍します。

ABA XOR B
000
011
101
110

足し算は AND と XOR でできる

ここからが本題です。2 進数で「1 桁 + 1 桁」の足し算を、すべてのパターンで書き出してみます。

ABA + B(2 進数)10 進数
0000
0111
1011
11102

結果を「下の桁(1 の位)」と「上の桁(桁上がり)」に分けると、次のようになります。

AB下の桁(Sum)上の桁(Carry)
0000
0110
1010
1101

下の桁(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 ゲートの両方に入ります。

XORAND入力 A入力 BSum(和)Carry(桁上がり)下の桁上の桁
図1 半加算器の回路

「1 + 1 = 2」を半加算器で追ってみる

A = 1、B = 1 を入れたときの動きを、順番に追ってみます。

順番ゲート計算結果
1入力A = 1、B = 1―
2XOR1 XOR 1 = 0Sum は 0
3AND1 AND 1 = 1Carry は 1
4並べるCarry(上の桁)、Sum(下の桁)の順10(2 進数)= 10 進数の 2
XORAND入力 A入力 BSum(和)Carry(桁上がり)下の桁上の桁1101
図2 A = 1、B = 1 を入れたときの半加算器

これが、コンピューターが「1 + 1 = 2」を計算している瞬間です。XOR と AND という2つの単純なゲートを組み合わせるだけで、足し算が成り立っています。

なぜ「半」加算器なのか

半加算器が「半(Half)」と呼ばれるのは、下の桁からの桁上がりを受け取る入力がないからです。1 桁目の足し算はこれでできますが、2 桁目からは A と B に加えて、下の桁から繰り上がってきた値(Carry in)も足す必要があります。

この3つの入力を足せる回路が、全加算器(Full Adder)です。全加算器は、半加算器を2つと OR ゲートを1つ組み合わせて作れます。

半加算器①半加算器②ORABCarry in(下の桁から)Sum(和)Carry out(上の桁へ)和桁上がり和桁上がり
図3 半加算器2つと OR ゲートで作る全加算器

全加算器を桁の数だけ並べ、各桁の 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 + 1100
8 ビット255 + 11 0000 00000000 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(算術論理演算装置)へと進んでみてください。

コメント