2進数 – 補数 | 符号ありのときの10進数の負の数の表し方
" 2進数 – 補数 “について、最近は高校の情報の授業で扱われるようになりました。
検定試験でもお馴染みで、符号ありのときに 10進数の負の数が出てきます。
学習の始めに 8 ビットで考えると桁が大きいので理解しにくいかと思います。
そこで、手頃な 4 ビットを中心に 2進数と10進数の変換を基礎として解説をしています。
2進数の0と1を反転させてから1を加えることで補数を求めることができるのですが、この内容を押さえるためにも10進数との関連を理解しておくことが大切になります。
まずは準備として2進数と10進数の変換について説明をします。
その後で、2進数の補数の求め方について解説をしています。
2進数 – 補数 :準備に10進数との変換
まず、2進数と10進数の関係を具体例を使って説明します。
2進数の補数を理解するためには、この関係をしっかりと押さえておくことが大切になります。
10進数は普段から使っている数字です。
その 5 は、
1・22+0・21+1・20 と書き直すことができます。
このように指数が0乗から順に最高位の数が 0 でない状態に表します。
すると、2進数にしたときの数が分かります。
22の位の数が係数の 1 です。
同じく 21の位の数が 0 で、
20の位の数が 1 です。
つまり、10進数の 5(10) は、
2進数では 101(2) にあたるというわけです。
通常の10進数の数と区別するために、どの何進数のことなのかを記すために、右下に (2) というように記述しています。
高校数学の整数の内容でも出てくるので、一般的な形でまとめておきます。
【n進数から10進数へ】
t1t2・・・tk(n) というn進数の数を10進数にすると、
t1nk-1t2nk-2・・・tk-1n1+tkn0となる。
n進数で考えているときは、
t1からtkは0以上n-1以下の整数となっています。
n が 2 のときが2進数です。
そのため、2進数で表された数は、0と1だけで表されていることになります。
もう一度、具体的な数字で見てみます。
110(2)を10進数にすると、
1・22+1・21+0・20
= 6 となります。
このようにして、2進数で表された数を10進数に変換することができます。
今度は10進数で表された数を2進数に変換することについて説明します。
10進数を2進数へ
10進数の 15 を2進数に変換するときは、上のような「すだれ算」を使います。
2進数に直したいので、2で順に割り、余りを外に書いていきます。
15÷2 は 7あまり1 なので、1を外に書きます。
7÷2 は 3 あまり 1 というように順に続け、最後に商が 0 となるときまで続けます。
そして、外のあまりについて、商が 0 になったときのあまりを最高位の数として、下から上へと順に並べます。
すると、2進数に変換された数になっています。
すなわち、
10進数の15は、
1111(2) という2進数の数に変換できました。
厳密に述べると、符号なしのときの10進数と2進数の変換の対応です。
符号ありのときについては、補数の説明をした後に述べています。
ここまで、10進数と2進数についての関係を述べてきましたが、これらの内容を土台にして、2進数の補数を求めるという流れになります。
2進数 : 補数の求め方
【補数】
ある自然数に対して、加えると 1 桁増える最も小さな数。
抽象的な意味を見ると、いま一つ分かりにくい内容に思うかもしれません。
この内容が表すことは、とりあえずは置いておき、補数の求め方から説明をします。
8ビットで考えても要領は同じなので、桁数が程よいので分かりやすさを狙って、4ビットのときについて解説をすることにします。
【補数の求め方】
2進数の各桁の0と1を反転し、1(2)を加えると、補数が求められる。
各桁の0と1を反転させるという内容を具体例を通じて押さえると、機械的に補数を楽に求められるようになるかと思います。
1001(2) という2進数で表された数の補数を求めてみます。
各桁の0と1を反転させると、
0110(2)となります。
さらに 1(2)を加えると、補数が求まります。
0110(2)+1(2)
= 0111(2) です。
求め方の通りに補数が求まりました。
1001(2)の補数が0111(2)です。
補数の意味を確かめる
「加えると 1 桁増える最も小さな数」ということでした。
1001(2)に補数0111(2)を加えてみます。
1001(2)+0111(2)
= 10000(2)となります。
確かに 1 桁増えました。
4ビットで考えていたので、
□□□□という4桁の数でしたが、
10000(2)は5桁と1桁だけ増えています。
次に「最も小さな」ということも見ておきます。
補数0111(2)から 1 つ小さくしてみます。
1001(2)+0110(2)
= 1111(2) と桁が増えていません。
これが、もとの1001(2)に加えたときに、「1 桁増える最も小さな数」ということです。
補数の求め方が分かったところで、さらに符号ありのときに、2進数に対応する10進数の負の数について解説します。
符号ありのときの負の数
□□□□の各□に0または1を配置した4桁の数が4ビットの2進数の数です。
場合の数の考え方で、
24=16通りの2進数の数が4ビットにおいて存在することが分かります。
これら16個の2進数の中で最大のものは、
1111(2)です。
符号なしで考えているときは、先ほど「すだれ算」で述べたように 15 に対応しています。
そのため、
0000(2) ; 0(10),
0001(2) ; 1(10),
0010(2) ; 2(10),
・・・
1111(2) ; 15(10)
という 16 個の対応が考えられます。
ここまでは、中学の数学で知っている符号なしのときの内容になります。
さらに、符号ありのときを考えます。
符号ありのときは、最高位の数字が 1 となるはじめの数字で、対応する10進数の数に負の数が登場し、折り返します。
0111(2) ; 7(10),
1000(2) ; -8(10),
1001(2) ; -7(10),
・・・
1111(2) ; -2(10)
1111(2) ; -1(10)
となります。
1000(2) ; -8(10)でマイナスが登場し、ここから2進数の方で1(2)増えると、10進数の方では-8(10)から1(10)増えるというようになります。
これが符号ありのときに、10進数の方で負の数が登場するという内容です。
符号なしだと、最高位の数がはじめて 1 となるところで、対応する10進数が8(10)でした。
符号ありのときは、最高位の数がはじめて 1 となるところで、対応する10進数にマイナスの符号をつけるというわけです。
そのため、
1000(2) ; -8(10) という対応になります。
4ビットだと、最高位の数が 1 となっている2進数に関して、対応する10進数の数の符号が全てマイナスとなっています。
4ビットの減算
1101(2)-1001(2)を計算すると、
0100(2)となります。
1001(2)の補数が0111(2)ということを先ほど述べました。
4ビットにおける減算では、補数を加え、超える桁上がりは無視するというルールのもとで考えることもできます。
つまり、
1101(2)-1001(2)を
1101(2)+0111(2)という補数との足し算だとし、超える桁上がりは無視するというわけです。
超える桁上がりを無視すると、同じ計算結果になります。
1101(2)+0111(2)
= 10100(2)となります。
5桁へ繰り上がりが起きたので、超える桁上がりで現れた最高位の 1 を無視します。
すると、
10100(2)は0100(2)となります。
これは、
1101(2)-1001(2)の計算結果と一致しています。
4ビットということに制限して議論をしているときは、このようにして減算を「補数との足し算で超える桁上がりは無視する」と捉えることができます。
このことを利用して、符号ありのときに負の数の10進数に対応する2進数を求めることができます。
例えば、-5 に対応する2進数を求めるときには、5 に対応する2進数を求めておき、その2進数の補数を求めます。
つまり、-5 に対応する2進数は、5に対応する2進数の補数ということになります。
この記事では、情報の授業などで扱われる内容を述べました。
高校の数学についての記事も投稿しています。
三乗和の公式など、他の記事では通常の10進数を使って議論を進めています。
4ビット(bit)において、符号ありのときについて述べました。
さらに8ビットのときで、符号ありのときを説明します。
8ビットで符号ありのとき
□が8個で、それぞれに0か1を配置するため、8ビットだと、
28=256 個の2進数を考えることになります。
8ビットで一番大きな2進数の数に対応する10進数の数を、符号なしのときについて求めておきます。
ここまで15(10)のように10進数を表記していましたが、桁数が多くて見ずらくなるので、通常のように15というように記すことにします。
11111111(2)に対応する10進数の数を計算します。
27+26+…+21+20
= 27+26+…+21+1 を計算した値が対応する10進数の数です。
27 = 128 というように指数を使わない形にして足し算をすると値が求まります。
高校数学Bのことも考えて、等比数列の和の公式を使って計算をしてみます。
27+26+…+21+1
= 1×(28-1)/(2-1)
= 255 です。
※ 128+64+…+2+1 を計算しても同じ値になります。
よって、10進数の255が、
11111111(2) に対応することが分かります。
ただし、この対応は符号なしのときの対応です。
符号ありで10進数の負の数が登場するときには、最高位の数字が 1 となるはじめの数字に注目して対応を整理することができます。
10000000(2) が8ビットのときに最高位の数がはじめて1となるときです。
この数に対応する10進数の符号をマイナスとするという規則です。
符号なしのときだと、
27 = 128 が対応します。
符号ありだと、これにマイナスをつけて対応させます。
よって、
-128が10000000(2)に対応する10進数の負の数です。
対応する規則を一覧にすると次のようになります。
00000000(2) ; 0,
00000001(2) ; 1,
・・・
01111111(2) ; 127,
10000000(2) ; -128,
10000001(2) ; -127,
・・・
11111111(2) ; -1
これで、8ビットについて符号ありのときの10進数との対応が分かりました。
関連する情報の内容として、
情報量-ビットや
16進数-変換という記事を投稿しています。
それでは、これで今回の記事を終了します。
読んで頂き、ありがとうございました。