3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

2の補数を使って引き算ができる仕組みを10進数を使って解説

Last updated at Posted at 2021-08-04

なんやねん「補数」って

「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. 全ビットを反転させる(1と0を反転させる)
  2. 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!)

数学って面白いなああああ。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?