2進数で補数の計算
その2では補数の計算について紹介します。ちなみに、どうしても苦手なら飛ばしてもいいかもしれません。基本情報の場合、午前試験では毎回数問、午後試験ではほとんど使わないと思います。
補数ってなに?
ちなみに補数を最初に考えた人ってすごいと思いました。補数を使えば、引き算を足し算で行うことが出来ます。このテクニックで、コンピュータに足し算の機能のほかに引き算の機能を追加せずに済んだわけです。引き算の答えを足し算ではじき出すのですからね。反対のことをして答えを出すってすごいと思いました。では補数を紹介していきましょう。
10進数の補数
では、まずは10進数で補数を考えましょう。普通に引き算を考えます。
$$
618 - 271 = 347
$$
なんてことない引き算です。ではこれを補数のテクニックを使ってやってみましょう。
$$
618 - 271 = 618 - 271 +1000 -1000
$$
これを計算します。
ちなみに。$1000-1000$は結局$0$ですから、足し算をしても結果は変わらないです。
まず、真ん中の2つです。
$$
-271 + 1000 = -271 + 999 + 1 = 728 + 1 = 729
$$
なぜ、ここで$1000=999+1$にしたかというと、桁の繰り下がりとかを気にしなくてよくなるからです。
筆算をしなくてよくなります。これは暗算テクニックです。ただし、2進数でも同様のことをやるので要注意です。
ではつぎの計算です。
$$
618 + 729 -1000 = 1347 -1000 = 347
$$
となります。まあ、当然同じ結果になるわけですが。。。
それでは、このとき,
$$
1000-271 = 729
$$
が補数です。この補数を足して、一番うえの桁に出てくる$1$を無視すると同じ計算になるのです。
10進数ではそんなに効果はないです。では、2進数ほ考えてみましょう。実は2進数では補数が威力を発揮します。
2進数での補数
簡単な例題から考えましょう。ここからは、数字は2進数です。
$$
111 - 10 = 101
$$
ですが、補数を考えましょう。
ちなみに、計算では最大3桁なので3桁での補数を考えます。
\begin{eqnarray}
111 - 10 &=& 111 - 10 + 1000 - 1000\\
&=& 1000 -10 + 111 -1000 \\
&=& 111 + 1 - 10 + 111 - 1000 \\
&=& 101 + 1 + 111 - 1000\\
&=& 110 + 111 - 1000 \\
&=& 110 + 111 - 1000 \\
&=& 1101 - 1000 \\
&=& 101
\end{eqnarray}
ここで$10$(ここでは3桁であることをはっきりさせるために$010$と書きましょう)の補数は
$110$です。このとき実は$010$補数$110$はつぎの2ステップで求めることが出来ます。
- 各桁の0と1をひっくり返す。
- それから、1を足す。(2進数なので、各桁には1か0しかないです。)
じつはこれだけです。計算を丁寧にやれば何行もかかりましたが、2進数の場合はこんなに簡単に求めることが出来ます。じつは、上で協調した計算テクニックが効いてるのです。「2進数なので、各桁には1か0しかないです。」という特徴のため、0と1をひっくり返すだけになるんです。
もちろん、最後に$+1$は忘れないでください。
ちなみに、参考書的な言葉で言うと
$+1$する前を1の補数
$+1$した後を2の補数といいます。
ちなみにコンピュータ的にいうと一番上の桁を$+$や$-$に使ったりします。
$1$が$-$で$0$が$+$です。
なので、$+$の数を一番上以外の桁で考えて$-$をその1の補数や2の補数で考えます
4桁の場合が次の表になります。
10進数 | $+$の2進数 | 1の補数 | 2の補数 |
---|---|---|---|
0 | 0000 | 1111 | (1)0000(5桁目は無視) |
1 | 0001 | 1110 | 1111 |
2 | 0010 | 1101 | 1101 |
3 | 0011 | 1100 | 1101 |
4 | 0100 | 1011 | 1100 |
5 | 0101 | 1010 | 1011 |
6 | 0110 | 1001 | 1010 |
7 | 0111 | 1000 | 1001 |
8 | 1000 | 0111 | 1000 |
ちなみに、8を見てください。4桁目が$+$では$1$、$1$の補数では$0$となっており、逆転してしまいました。なので、$1$の補数は実は8では使えません。しかし、$2$の補数では使えます。
これが、ややこしいところです。