1の補数・2の補数って何?そもそも補数って?分かりやすく解説します!

1の補数・2の補数

こんにちは!くるです!

今回は論理回路を勉強していると出てくる「1の補数・2の補数」について説明していきます。

「計算はできるけど、意味はあんまり分からない(汗)」といった方のために、「補数とは一体何なのか」を分かりやすく解説していくので、ぜひ最後まで読んでいってください(*’ω’*)

そもそも補数って?

補数とは「足したらピッタリ桁上がりが起こる数」である

1の補数・2の補数を考える前にそもそも「補数」とは何なのかについて考えてみましょう。

くるる
くるる

「補数」ってことは「何かを補う数」なんすかねぇ?

その通りです。では何を補うのか?次の例を見てみましょう。

「4」は「6」を足すと「10」

「12」は「88」を足すと「100」

「267」は「733」を足すと「1000」

このとき、「6」,「88」,「733」という数字を足すことで、ピッタリと桁上がりした数字(10, 100, 1000)になっていることが分かります。

この「6」,「88」,「733」をそれぞれ「4に対する補数」,「12に対する補数」,「267に対する補数」と言います。

つまり「ある数がピッタリと桁上がりした数字になるために補わなければならない(足さなければならない)数字」という意味で「補数」と呼ばれているわけです。

先生
先生

補数は何進数でも存在する

先ほどの例では10進数だけでしたが、実は補数は何進数の数にも存在するのです。このとき、一般的に次のようなことが言えます。

MEMO✎

補数とは「$n$進数の数に足した和が$n$のべき乗になるような数」である

例えば、10進数のとき

$$4+6 = 10 = 10^1, \quad 12+88 = 100 = 10^2, \quad 267+733 = 1000 = 10^3$$

となるため、「6」,「88」,「733」は10進数における補数です。

例えば、2進数のとき

$$10+10=100=2^2, \quad 010+110=1000=2^3, \quad 1011+0101=10000=2^4$$

となるため、「10」,「110」,「0101」は2進数における補数です。

このように、何進数であっても補数というのは存在するのです。

$n$進数の補数のことを「$n$の補数」と呼ぶ

例えば、10進数の補数なら「10の補数」、2進数の補数なら「2の補数」と呼ばれます。これは何進数でもこういう言い方をするのです。

【10進数の場合】
「4」の補数は「6」なので、「6は4に対する10の補数」
「8」の補数は「2」なので、「2は8に対する10の補数」

【2進数の場合】
「0101」の補数は「1011」なので、「1011は0101に対する2の補数」
「1100」の補数は「0100」なので、「0100は1100に対する2の補数」

ちょっと特殊な補数

今までは「足したらピッタリ桁上がりが起こる数」のことを補数と考えていましたが、実はこれ以外にもあるんです。

それが、「足したらギリギリ桁上がりが起こらない数」です。

ポンタ
ポンタ

どういうこと???

例えば、10進数のとき$4+5=9$となりますが、このとき「5」は「4」に足してもギリギリ桁上がりが起こらない数です。

2進数なら$0101+1010 = 1111$となりますが、「1010」は「0101」に足してもギリギリ桁上がりが起こりません。

これらは「減基数」という考えに基づいた補数であり、本来の補数と区別する意味も込めて、「5」を「4に対する”9″の補数」、「1010」を「0101に対する”1″の補数」というような呼び方をします。

つまり次のようなことが言えるのです。

MEMO✎

「n進数の数に足した和=nのべき乗から1引いた数」になる数も一種の補数

【10進数】
$4+6 = 10^1$より「6は4に対する10の補数」
$4+5=9=10^1-1$より「5は4に対する9の補数」

【2進数】
$0101+1011=10000=2^4$より「1011は0101に対する2の補数」
$0101+1010=1111=2^4-1$より「1010は0101に対する1の補数」

1の補数と2の補数

さて、「補数」について簡単に理解できたと思うので、ここからは特に「1の補数と2の補数」に絞って説明をしていきます。

1の補数とは?

1の補数は先ほど出てきたちょっと特殊な補数で、「足したらギリギリ桁上がりが起こらない数」のことです。

計算方法自体は2の補数よりも簡単で、「0と1をひっくり返すだけ」です。

1001をひっくり返すと0110だから、0110は1001の1の補数

0011をひっくり返すと1100だから、1100は0011の1の補数

くるる
くるる

なんとなくわかったっす!

2の補数とは?

こちらももう何度も説明したのでわかっていると思いますが、2の補数は「足したらピッタリ桁上がりが起こる数」のことです。

計算方法は1の補数より少し難しく、「0と1をひっくり返して1を足す」です。

1001をひっくり返すと0110で、1を足すと0111だから、0111は1001の2の補数

0011をひっくり返すと1100で、1を足すと1101だから、1101は0011の1の補数

ポンタ
ポンタ

簡単だね!

なぜ1の補数と2の補数が必要なのか?

ではなぜ1の補数と2の補数という意味の分からないものを考える必要があるのでしょうか?

補数を使う最大のメリットは「足し算で引き算を表現できる」ことです。


例えば、$15-8=7$という計算を2の補数を使って行うと次のようになります。

$$15_{(10)}-8_{(10)}=01111_{(2)}-01000_{(2)}=01111_{(2)}+11000_{(2)}=100111_{(2)}$$

このとき、桁上がりが起こった場合はその桁を消去します。なので、$00111_{(2)}=7$となり正しい答えになりました。


次に、$8-15=-7$という計算を考えてみましょう。

$$8-15 = 01000_{(2)}-01111_{(2)}=01000_{(2)}+10001_{(2)}=11001$$

このとき、桁上がりは起こらないので消去する桁はありませんが、最上位の桁が1になっています。そういうときは最上位の桁だけを負の数と考えるのです。

つまり、$11001_{(2)}=-10000+01001=-16+9=7$というように計算すると正しい答えになります。


このように、補数を使うと「足し算で引き算を表現できる」のです。

足し算を引き算で表現できると、本来コンピュータが引き算をするときに必要な減算機というものがいらなくなり、コンピュータの回路を簡単にすることができます。

なので、足し算を引き算で表現できるというのは非常に嬉しいメリットなのです。

今回はここまで!

最後まで見て頂きありがとうございました!

先生
先生

シェアしてね!

コメントを残す

メールアドレスが公開されることはありません。

PHP Code Snippets Powered By : XYZScripts.com