2進数の足し算と引き算

2進数計算の足し算、引き算の方法です。

2進数の足し算

足し算は桁を上げるだけなので、1111と110を計算すると、

10101になります。

簡単に説明しますが、1111と110の1桁目の1と0を足すと1になりますので、1桁目は1のままです。次、2桁目。1と1を足すと2進数の場合は桁が上がるので、2桁目は0で3桁目に1上がります。次、3桁目。3桁目は1と1を合せて桁が上がるので、3桁目は0のようですが、さきほど上がってきた1が残っているので、3桁目は1になります。最後、4桁目。4桁目は1と0(片方は4桁目がないので0で表す)にさらに、先ほど上がってきた1を足すと0となり、1桁上がり、5桁目が1になります。

結果、10101になります。

2進数の引き算


2進数の計算は単純に引くことはできません。なぜならコンピュータには引き算の概念がないからです。コンピューターには足し算しかできません。「ではどうやって引き算をすれば良いのか?」ですが、答えは負の数を足し算するが答えです。例えば5−3は、5+(−3)も同じ意味です。5に負の数−3を足せば、5−3になります。
問題はどうやって負の数を2進数で表現するかです。
2進数の引き算の方法として、手っ取り早く実行できるのは先頭の1ビットを符号として見なすことで先頭ビットが0の場合は正の数、0の場合は負の数とすることです。しかし、これだと例えば、00001を1、10001を−1となり、これを足すと0にならないといけませんが、(桁ビットを除くと)0010となります。0ではありませんね。なのでこれはダメ。
ではどうやって引き算を表すかというと補数という数を使います。補数とは、そのままですが、補う数を意味します。そして、補数には2種類あって、「その桁数での最大値を得るために 補う数」と「次の桁に繰り上がるために補う数」という2つの補数が存在します。そして前者を1の補数、 後者を2の補数と呼びます。(2進数の場合)
例えば、0101という2進数の数があります。この1の補数はなにかというと、
1111(この桁の最大数)−0101=1010となり、1010が1の補数となります。
0101の2の補数はなにかと言うと、10000(次の桁に繰り上がる数)−0101=1011となり、1011が2の補数となります。
負の数の計算にはこの2の補数を使います。
ただし、計算のたびにこのような変換をするのは 手間なので簡単に2の補数を 表現する方法があります。それが①正の数のビットを 反対にして②最後に①を足すというものです。
さきほどの0101も1010にして、1を足せば、1011となります。これは2の補数ですね。

引き算の例(結果が正の場合)

ではさきほどの例に挙げた5-3を2の補数を用いて、2進数でやってみましょう。

5を2進数に変換すると0101です。-3を2の補数で表すと0011を反転して、1100で1を足すので、1101です。では0101と1101を足してみます。結果は10010となり、先頭ビットは無視するので、0010です。つまり、2になります。


引き算の例(結果が負の場合)

ではつぎは結果が負の数になるような引き算をしてみます。

2-6を2進数でやってみましょう。まず2を2進数で表すと0010です。つぎに-6を2の補数で表すと0110を反転して1001となり、1を足すので1010となります。

0010と1010を足すと1100となります。2の補数を用いて計算する場合、先頭ビットが1の時は負の数なので、1100はまず負の数と分かります。これを2進数に直すと、反転して0011となり、これに1を足すと0100となるので答えは-4となります。計算結果の先頭ビットが1となった時は2の補数で表した負の数になります。そのため、そこから本来の数に戻さないと数は分からないです。2の補数からもとの数に戻す時も反転して1をプラスして、マイナスを付ければ実際の数が分かります。2の補数で-1は1111と表しますし、1は0001と表します。これらはどちらから見ても2の補数の関係になります。

おわり。

レバテックキャリアがエンジニアにおすすめな理由

この記事が気に入ったらサポートをしてみませんか?