![]() |
補数 (complement) |
補数とは、ある数 (A) に加えると、和の桁がひとつ上がる最小の数のことです。
下の図にはある数 (A) が 2進数と 10進数で表示されており、
それに 「補数」 が加えられて、和が A より一桁多い最小の数になっています。
2進数で表示した A は 8桁で、 補数を加えると 9桁のいちばん小さい数字、
100000000 になっていますし、
同じ A を 10進数で表示すると 3桁となり、 補数を加えると、 その和は 4桁でいちばん小さい数字、
1000 です。
この場合、 2進数の補数を 「2の補数」、 10進数の補数を 「10の補数」 ともいいます。
また、 N進数のある数 (A) に加えると、和の桁が上がらない最大の数を
「N-1 の補数」 といいます。
2進数の 「N-1 の補数」 は 1の補数で、 「1の補数」 のボタンをクリックすると、
A と 1の補数の和は 8桁の 2進数でいちばん大きい数字、
11111111 になります。
10進数の場合、 A に 「9の補数」 を加えると、
その和は 3桁でいちばん大きい数字、 999 です。
したがって、 ある数値 A の補数を求めるには、 引き算をすればいいことになります。
下図の場合、 2の補数なら 100000000 から、
10の補数なら 1000 から引きます。
もちろん、1の補数は 11111111 から、
9の補数は 999 から引きます。
補数を使えば、 減算を 「加算」 で行うことができます。
下の図では 2進数 A と B で、左では "引き算" で計算していますが、
右では B の 2 の補数を加えています。
和の最上位桁を無視すれば、どちらも同じ結果になっていることが分かります。
なぜ同じになるのでしょうか?
一見、不思議に思えますが、考えてみればバカバカしいほど当たり前です。
いま、 A は 11111111、 B は 10000001 だとします。
このとき、 B の 2の補数は 1111111 です。
2の補数はどうして計算したかというと、 100000000 から B を引いたのです。
B の 2の補数 = 100000000 − 10000001 = 1111111
上の右側の計算では、A にこれを加えたのですから、
11111111 + (100000000 − 10000001) = 101111110
という計算をしたことになります。
和の最上位桁を無視すれば、
減算と同じ結果が得られるのは当然です。
ではなぜ、わざわざ 2の補数を使うのでしょうか?
それは、2進数の補数は簡単に作れるからです。
10進数の補数を作るには、本当に "引き算" をしなくてはなりませんが、
2進数の 1の補数は引き算をしなくても、もとの数の 1 と 0 を反転するだけですみます。
10000001 の 1の補数は 01111110 です。
これに 1 を加えれば 2の補数、 01111111 になります。
電子回路 (コンピュータ) にとって、 0 と 1 を反転させるのは朝飯前です。
NOT 回路 を
桁の数だけ並べるだけです。
こうしてできた 1の補数を レジスタ に入れておいて、
ひとつカウントアップすれば 1 を加えたのと同じになります。
レジスタはもともと、コンピュータの中にはたくさんあります。
加算回路に少し手を加えるだけで、 減算もできるようになるからです。