シリーズ「コンピュータの計算のしくみ」 第3

回路が「引く」とは?

引き算をする回路は、無い

前回、全加算器を 4 つ横に並べて 4 桁の足し算ができる回路を作った。 最後にこう書いた——コンピュータの中に「引き算をする回路」は無い、と。

これは言葉のあやではない。本当に無いのだ。 実際のコンピュータの中にも、引き算のための専用回路は入っていない。 前回作ったあの加算器が、そのまま引き算にも使われる。

7 - 3 を計算したいなら、7 + (-3) を計算すればいい。 足し算に化かしてしまえば、加算器がそのまま使える。 問題は、-3 をどうやって 0 と 1 だけで作るかである。

その答えを、まず触って見てほしい。前回の回路に、スイッチが 1 つ増えただけだ。

4 桁の加減算器 シミュレータ

右端の「モード」を押すと、同じ回路のまま足し算と引き算が入れ替わります

XORXORXORXOR全加算器全加算器全加算器全加算器1 の位2 の位4 の位8 の位A0B0A0B0A0B0A0B0モード0足し算繰り上がり

0000 + 0000 = 00000

10 進法でいう 0 + 0 = 0

押して、確かめる

見た目はほとんど前回のままだ。全加算器が 4 つ横に並んでいる。 増えたのは、各桁の B の線の上に乗った XOR の箱 4 つと、右端の「モード」のスイッチだけである。

  • まず、モードを 0 のままにして A に 0111(十進法の 7)、B に 0011(十進法の 3)を作ってみてほしい。答えは 01010、十進法の 10 になる。前回と何も変わらない。
  • そのまま、右端のモードのスイッチだけを押してみる。
  • 答えが 0100 に変わる。十進法の 4 だ。7 - 3 = 4

A も B も、指一本触っていない。 全加算器も 4 つのまま、増えても減ってもいない。 モードのスイッチを 0 から 1 にしただけで、足し算が引き算になった。

いくつか試してみてほしい。1001 - 01000101。9 - 4 = 5。 0111 - 01110000。7 - 7 = 0。合っている。

いったい何が起きているのか。

数取器で、引き算をする

回路から少し離れて、十進法の話をする。

4 桁の数取器を思い浮かべてほしい。 イベントの入り口で入場者を数えるときに、手に持ってカチカチ押すあれだ。 0000 から 9999 まで表示できて、9999 の次はまた 0000 に戻ってしまう。

数取器

数取器

この数取器で、1 を引きたいとする。押すことしかできず、逆回しはできない。 どうするか。9999 回押すしかない。10000 回押せば 1 周して元に戻るのだから、 9999 回押すのは 1 戻るのと同じことである。

同じ理屈で、1348 を引きたければ 8652 回押せばいい(1348 + 8652 = 10000 だから)。 たとえば 5273 から 1348 を引いてみよう。

5273
+8652
13925

答えは 13925 だが、数取器は 4 桁しかない。一万の位(打ち消し線を引いた左端の 1)を表示する場所が無いので、そこは消える。 残るのは 3925。5273 - 1348 = 3925。合っている。

引き算を、一度もしていない。足し算と、桁があふれて消えることだけで済んでいる。

なぜ「8652」を作るのが簡単なのか

いまの話には、ずるいところがある。 8652 という数を出すのに「10000 - 1348」という引き算をしてしまった。 それでは足し算のみで完結していないため、意味がない。

理由は後述するが、実は足し算で引き算を成立させるには、まず繰り下がりが起こらない引き算で計算する必要がある。

まず 9999 から 1348 を引く。

9999
-1348
8651

この引き算は、4桁ではなく1桁ずつで成立している。 各桁で「9 から数字を引く」だけであり、繰り下がりが絶対に起こらないからだ。 9 から何を引いても、答えは必ず 0 から 9 に収まる。隣の桁を気にする必要がない。 9 - 1 = 8、9 - 3 = 6、9 - 4 = 5、9 - 8 = 1。桁ごとに独立して、見た瞬間に決まる。

そして 8651 に 1 を足せば 8652 になる。これでさっきの数ができた。

まとめるとこうだ。10進法の世界では各桁を 9 から引いて、最後に 1 を足す。 それが「引く数」の代わりになる。

さて、ここからが本題である。 2 進法の世界では、使える数字は 0 と 1 の 2 個しかない。 だから「9 から引く」にあたる操作は「1 から引く」になる。

1 - 0 = 1。1 - 1 = 0。

……見比べてほしい。0 は 1 に、1 は 0 に変わっている。 これは引き算というより、ただの反転である。

十進法では「9 から引く」という計算が必要だった。 2 進法では、それがひっくり返すだけになる。

反転して、1 を足す

いま分かったことを、4 桁で書き直しておこう。

B の各桁を反転したものは、1111 - B に等しい。 だからそれに 1 を足すと、こうなる。

(B の反転)+ 1 = 1111 - B + 1 = 10000 - B

これを A に足すとどうなるか。

A + (10000 - B) = (A - B) + 10000

欲しかった A - B が出てきた。ただし 10000 という余計なものがくっついている。

この 10000 は 2 進法の 5 桁で、十進法でいえば 16 のことだ。 さきほど数取器で出てきた十進法の 10000 とは、数としては別ものである。 けれど桁があふれて表示されないという役割は、まったく同じだ。

10000 は 5 桁目。この回路は 4 桁しかない。 5 桁目にはつなぎ先が無いので、そこには何も残らない。

さっきの数取器で、一万の位が表示されずに消えたのと同じである。 残るのは A - B だけだ。

スイッチ 1 つで、両方をやる

ここまでの話で、引き算に必要な操作は 2 つに絞られた。

  1. B を反転する
  2. 1 を足す

回路がやっているのは、この 2 つだけである。しかも、どちらも同じ 1 本の信号でまかなっている。

反転のほう

B の線に乗っている XOR の箱を見てほしい。片方の入力は B、もう片方はモードの信号だ。 第 1 回で出てきた XOR の表を、もう一度出す。

モードBXOR の出力
000
011
101
110

上の 2 行——モードが 0 のとき、出力は B とまったく同じである。素通りする。

下の 2 行——モードが 1 のとき、出力は B の逆になっている。反転する。

第 1 回では XOR を「入力が食い違っているときだけ 1 になるゲート」と説明した。 それは間違っていないが、こういう読み方もできる。 XOR は、片方の入力が 1 のとき、もう片方を反転させるゲートである。

同じ表を、違う角度から読んだだけだ。ゲートは何も変わっていない。

1 を足すほう

もう 1 か所。一番下の桁の全加算器の、繰り上がり入力を見てほしい。

前回、ここは 0 に固定していた。一番下の桁には、下から上がってくるものが無いからだ。 その空いていた入り口に、モードの信号をつないである。

モードが 1 になると、一番下の桁に 1 が入る。 下から繰り上がってきた 1 と、回路には区別がつかない。 全加算器は言われたとおり、それも一緒に足すだけだ。

これが「1 を足す」である。足し算のための部品は、1 つも増えていない。

配線を目で追ってみてほしい。モードのスイッチから出た線は、上へ伸びて 4 つの XOR に枝分かれし、 同時に左へ伸びて一番下の桁の繰り上がり入力に入っている。 1 本の信号が、反転と +1 の両方を引き受けている。

5 桁目を捨てるということ

前回の最後に「鍵はまた桁が尽きることにある」と書いた。それがここである。

左端のランプをもう一度見てほしい。 足し算のモードでは、これは答えの 5 桁目だった。1000 + 1000 をすれば点灯して、 答えが 10000(十進法の 16)であることを教えてくれる。大事な情報だ。

引き算のモードでは、同じランプが 10000 のなれの果てになる。 0111 - 0011 を作ると点灯しているはずだが、この 1 は答えには使わない。捨てる。

正確に言えば、回路は捨ててすらいない。 5 桁目を受け取る場所が、そもそも無いだけである。 そこにつながる全加算器を作らなかったから、行き場がなくて消えている。

十進法の数取器が一万の位を表示しなかったのと、まったく同じことだ。 何かを判断して切り捨てているのではない。桁が尽きたから、勝手に消える。

引き算がうまくいくのは、この「勝手に消える」性質を利用しているからである。

増えた部品を、数えてみる

前回の加算器から、この回路に増えたものを数えてみよう。

  • XOR が 4 つ(各桁の B を反転するため)
  • モードの信号を配る配線

以上である。全加算器は 4 つのまま。中身も前回と同じ、半加算器 2 つと OR 1 つ。 そしてその半加算器は、第 1 回で作った XOR と AND だけの回路だ。

引き算をする部品は、1 つも作っていない。

第 1 回で作った 1 桁の足し算が、組み合わさって全加算器になり、 横に並んで 4 桁の足し算になり、XOR を 4 つ足しただけで引き算になった。 新しい原理は、途中で一度も出てきていない。

コンピュータの中に引き算をする回路が無い、というのはこういう意味である。

それで、マイナスは?

最後に 1 つだけ、試してほしいことがある。

引き算のモードのまま、A に 0011(3)、B に 0111(7)を入れてみてほしい。 3 - 7 だから、答えは -4 のはずだ。

出てくるのは 1100。そして左端の 5 桁目のランプは、点かない。

1100 は、これまでの読み方でいえば十進法の 12 である。-4 ではない。 けれど 12 と -4 は、ちょうど 16 だけ離れている。10000 の分だけだ。

回路が壊れたわけでも、間違えたわけでもない。 5 桁目が消えたぶんが、そのまま答えのずれになって残っている。 つまり 1100 は、この回路にとっての -4 の姿なのだ。

では、1100 を見たときに 12 なのか -4 なのか、どうやって決めればいいのか。 点かなかった 5 桁目のランプは、何を教えてくれていたのか。

次回はそれを見てみよう。

参考文献