なんやねん「補数」って
「2の補数を使えばマイナス数を表現でき、それを加算することによって引き算が実現できる」
ということは事実としてご存知だと思います。
しかしどういう原理でそれが可能なのか、不思議な方も多いと思います。
今回はそんな方を対象に、補数での引き算の原理を10進数を使って解説します。
補数の種類
まず、今後混乱しないためにも、補数には二種類ある事をお伝えしておきます。N進数には「Nの補数」と「N-1の補数」があります。
なので2進数では「2の補数」と「1の補数」、10進数では「10の補数」と「9の補数」がある、という事になります。
この記事では「Nの補数」についてだけ説明します。
Nの補数とは
一言で説明すると
「ある数」の桁が1つ増える為に必要な最小の数
という事です。
例えば、10進数の6で考えます
6は1桁
これを2桁にするためには、4を足して
6+4=10
で2桁となる
もちろん、5を足しても11という2桁になるが、ここでのポイントは
「桁が1つ増える為に必要な最小の数」という点
なので、1桁である6を2桁にする為の最小の数は4
これの求め方は 10-6=4 でOK
つまり、6を1桁から2桁にする為の最小の数は4なので、
「6に対する10の補数」は4となる
という感じです。
この「4」というのが、補数的な表現としての「-6」になります。
補数を使って引き算をしてみる
よく分からないと思うので、実際に10進数で、補数を用いた引き算をやってみます。
8-6の場合
先ほどやったように、6に対する10の補数は4
なので、「-6」という数は補数で表現すると「4」になる
「8-6」を計算する場合、「8+(-6)」と考えられるので、
「(-6)」を「4」に置き換えて
8+4 を計算する
その答えは「12」となるが、このうち、10の位(最上位)は無視
すると「2」だけが残り、これが 8-6 の答え
はい、できました。
ゑ?
いや、なぜ10を無視できるんだ?それで「2」という答えが得られたのはたまたまじゃね?
のように、何か騙されたような気持ちかもしれません。
解説します。
解説
先ほどの計算を次のように見ていきます
8+4=
8+(10-6)=
8+10-6=
10+8-6= <-- 注目
10+2=12
お分かり頂けますでしょうか?
「注目」の部分を見れば分かるように、「8-6」が出てきているのです。
これによって「2」が得られ、代わりに「10」が余分になります。
よって、10は「無視する」という事です。
機械的な手順としては、Nの補数を加算した後、最上位の「1」を無視すれば引き算の結果が得られるという事です。
凄いでしょ?!
しかし・・・
いや、でも、騙されてはいけません。先ほどの例では、8+4としましたが、
じゃあこの「4」はどこから出てきましたか?
そうですよね。
結局「10-6」と、引き算して求めたんです。
「じゃあ最初から素直に8-6やれよ」
って思いますよね?
ところが・・・
先程の10進数の例では、補数を求める為に結局引き算を使っていました。
だから「最初から引き算やれ」と突っ込まれるのですが、
しかし2進数では・・・本当に、どこにも引き算が必要無いんです!!
2進数における補数の求め方
これはITパスポートとか基本情報レベルなので、良く知られている事実かと思いますが、
2進数の補数の求め方は
- 全ビットを反転させる(1と0を反転させる)
- 1を加算する
という、たったこれだけの操作で、「機械的に」求められるのです!
3進数以上ではこうはいきませんよね。
で、これで求められた2の補数を加算し、そして、最上位の「1」を無視します。
すると、それ以降に並んでいる数が「引き算の結果」という事です。
実際に2進数での引き算の様子を見てみましょう。
54 - 13 の場合
54:00110110(8桁)
13:00001101(8桁)
※桁数は何でも良い
54 - 13 は
54 + ( -13 ) なので、
-13 = 13の補数 = 11110010(13の反転) + 1 = 11110011
よって
00110110(54) + 11110011(13の補数) = 100101001(9桁)
100101001 のうち、最上位の「1」は無視 → 1(00101001)
括弧の部分は「41」
よって答えは 41
こういう仕組みです。
でもやっぱり騙されたような感覚になると思うので、
深く納得したい方は、実際に手を動かして計算してみて下さい。
最後に、900-123をやってみます
123に対する10の補数・・・1000-123=877
900+877=1777
最上位の「1」は無視
答え 777(GOGO CHANCE!)
数学って面白いなああああ。