シリーズ「コンピュータの計算のしくみ」 第3回
回路が「引く」とは?
引き算をする回路は、無い
前回、全加算器を 4 つ横に並べて 4 桁の足し算ができる回路を作った。 最後にこう書いた——コンピュータの中に「引き算をする回路」は無い、と。
これは言葉のあやではない。本当に無いのだ。 実際のコンピュータの中にも、引き算のための専用回路は入っていない。 前回作ったあの加算器が、そのまま引き算にも使われる。
7 - 3 を計算したいなら、7 + (-3) を計算すればいい。 足し算に化かしてしまえば、加算器がそのまま使える。 問題は、-3 をどうやって 0 と 1 だけで作るかである。
その答えを、まず触って見てほしい。前回の回路に、スイッチが 1 つ増えただけだ。
4 桁の加減算器 シミュレータ
右端の「モード」を押すと、同じ回路のまま足し算と引き算が入れ替わります
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 - 0100 は 0101。9 - 4 = 5。
0111 - 0111 は 0000。7 - 7 = 0。合っている。
いったい何が起きているのか。
数取器で、引き算をする
回路から少し離れて、十進法の話をする。
4 桁の数取器を思い浮かべてほしい。
イベントの入り口で入場者を数えるときに、手に持ってカチカチ押すあれだ。
0000 から 9999 まで表示できて、9999 の次はまた 0000 に戻ってしまう。
この数取器で、1 を引きたいとする。押すことしかできず、逆回しはできない。 どうするか。9999 回押すしかない。10000 回押せば 1 周して元に戻るのだから、 9999 回押すのは 1 戻るのと同じことである。
同じ理屈で、1348 を引きたければ 8652 回押せばいい(1348 + 8652 = 10000 だから)。 たとえば 5273 から 1348 を引いてみよう。
答えは 13925 だが、数取器は 4 桁しかない。一万の位(打ち消し線を引いた左端の 1)を表示する場所が無いので、そこは消える。
残るのは 3925。5273 - 1348 = 3925。合っている。
引き算を、一度もしていない。足し算と、桁があふれて消えることだけで済んでいる。
なぜ「8652」を作るのが簡単なのか
いまの話には、ずるいところがある。 8652 という数を出すのに「10000 - 1348」という引き算をしてしまった。 それでは足し算のみで完結していないため、意味がない。
理由は後述するが、実は足し算で引き算を成立させるには、まず繰り下がりが起こらない引き算で計算する必要がある。
まず 9999 から 1348 を引く。
この引き算は、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 つに絞られた。
- B を反転する
- 1 を足す
回路がやっているのは、この 2 つだけである。しかも、どちらも同じ 1 本の信号でまかなっている。
反転のほう
B の線に乗っている XOR の箱を見てほしい。片方の入力は B、もう片方はモードの信号だ。 第 1 回で出てきた XOR の表を、もう一度出す。
| モード | B | XOR の出力 |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
上の 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 桁目のランプは、何を教えてくれていたのか。
次回はそれを見てみよう。
参考文献
- 松下俊介 著. 基礎からわかる論理回路. 第2版, 森北出版, 2021.7. 978-4-627-82842-1. https://ndlsearch.ndl.go.jp/books/R100000002-I031573740
- 馬場敬信 著. 算数で読み解くコンピュータのしくみ, 技術評論社, 2022.8. 978-4-297-12960-6. https://ndlsearch.ndl.go.jp/books/R100000002-I032268791