【補数までは頑張れ!】混乱を紐解く「2段構え」の補数講座(基本情報技術者試験)
このNoteは、補数問題に正解する最低限のスキル、もし混乱した時の対策に分けてまとめています。
必ず理解して欲しいのは3点です。
もちろん逆手順(図のオレンジ)のように、-1して反転してもできます。でも、同じ「反転して+1」で相互に変換できるので1種類だけ覚えればOKです。不思議ですよね。
例えば、111は「普通の数」として使うと10進数の7ですが、「補数」によって10進数の-1として使うと、引き算を足し算にできます。1 - 1 = 001 - 001と計算するところを、1 - 1 = 1 + (-1) = 001 + 111としています。
例えば、2桁の2進数では、-2~+1。
$$
-2^{(2-1)} ~ +2^{(2-1)}-1\\= -2~+1
$$
3桁の2進数では、-4~+3
$$
-2^{(3-1)} ~ +2^{(3-1)}-1\\
= -2^2 ~ +2^2-1 \\
= -4~+3
$$
私のIT専門学校の学生さんも、以上3点をまずは覚えて正解しています。
しかし勉強を進めると、覚える公式はたくさん出てきて、勘違いしたりド忘れしたりして不正解になる学生さんも多くなります。
そこで粘り強く正解できる対策も「補強」として書いておきました。
それでは始めましょう!
必須 | 補数の作り方
例えば、2進数001(普通の数)から「補数」を作ってみます。
001の「各ビットを0,1反転」して、110。110に「+1」して111です。
2進数001は10進数の1。「001の補数111」を「10進数の-1」として使います。
次に、補数111から「普通の数」に戻してみます。手順は同じ(不思議ですよね)。
2進数111(補数)の「各ビットを0,1反転」して、000。000に「+1」して001です。元の001に戻りましたね。
勿論「普通の数→補数」の「各ビットを0,1反転、+1」の逆工程、「-1して、各ビットを0,1反転」でも戻りますよ。
2進数111(補数)の「-1」して、110。110の「各ビットを0,1反転」して、001(図のオレンジ)。
でも「各ビット0,1反転、+1」だけで「相互」変換できるので、イチイチ使い分けなくて良いですね。心配な方は、いくつかの数で更に試して「どっちの変換でも同じ手順でOK」を確認してみてくださいね。
必須 | 補数を使う意味
「なぜ補数なんて、わけ分らん数を使うんだ」と思いますが、答えはコンピュータの計算が楽になるからです。
私たちも足し算では繰り上がり、引き算では繰り下がりを考えたり大変ですよね。でも補数を使うと、引き算も足し算で計算できるようになります。
コンピュータも足し算回路だけ準備すれば良く、引き算回路が不要になるので、メリットなんです。
先ほどの「3桁の2進数」の例で考えてみます。
2進数の001:「普通の数」で10進数の1と同じ
補数の111:「補数」で10進数の-1と同じ
足し算すると、001 + 111 = 1000となりますよね。
ここでコンピュータの特性。
つまり「3桁までの計算ができる」コンピュータでは、1000の「4桁目の1」は無視され、計算結果は3桁目までの「000です!」となるんです。
2進数の000は、10進数の0ですよね。
したがって「001 + 111」は、10進数でいう「1 + (-1)」を計算したのと同じです。
本来は10進数の「1 - 1 = 0」を2進数「001 - 001 = 000」と計算しますが、「001 + (-001)」と考え「-001」を補数「111」で表して「001 + 111 = 000」と足し算で行えることになります。
コンピュータで計算するには、電子回路が必要です。
本来は「足し算用の回路」と「引き算用の回路」を用意する必要がありますが、補数を使えば「足し算用の回路」だけで、足し算と引き算ができるので設計上でもメリットがあるのです。
必須 | 補数の表現範囲
補数を使った2進数で表現できる範囲には、公式があります。
$$
-2^{n-1}~+2^{n-1}-1
$$
つまり、2桁の2進数なら「-2~+1」。
$$
-2^{2-1}~+2^{2-1}-1 \\
= -2^1 ~ 2^1-1\\
= -2 ~ +1
$$
3桁の2進数なら「-4~3」。
$$
-2^{3-1}~+2^{3-1}-1 \\
= -2^2 ~ 2^2-1\\
= -4 ~ +3
$$
ここまでの3点が理解できた方は、問題演習に入ってもOKです。
「普通の数」⇔「補数」は、「各桁ビット反転して+1」
「マイナスの数」を「補数」で表すと、引き算を足し算でできるようになる
補数ありの表現範囲は、「-2^(n-1)-1 ~ +2^(n-1)」
補強 | 今後混乱したときに
私は、公式の暗記は好きではないです。
(元々暗記に自信がなく、高校物理のテストで最初の10分間は公式を求める作業から始めるヘ●タイだったのもあります)
2進数の公式はややこしいので、足元をすくわれる学生さんをたくさん見てきました。
今回の公式は、「補数ありの表現範囲は、-2^(n-1) ~ +2^(n-1)-1」でしたよね。
しかし勉強するともう一つ公式を覚えることになります。
ネットワークの「割り当てられるIPアドレスの個数は?」の問題で使う公式です。>IPアドレスの解説Note
例えば、2桁の2進数は、00, 01, 10, 11の4種類(= 2^2)。3桁なら、000, 001, 010, 011, 100, 101, 110, 111の8種類(= 2^3)。
表現範囲で、指数「n-1」にしたり、負の数を「-1」したりしたので、「種類の公式は、2^(n-1)だったかな? 2^(n)-1だったかな?」なんて大混乱する学生さんが続出します。
「とりあえず公式で正解できればOK」は否定しません。
しかし、もし混乱しちゃったなら、間違ったなら、反省をして、回り道でも確認できる力を身に付けて欲しいです。
それが「粘り強さ」になり合格に近づきます。それが「地頭の良さ」に繋がり就職の適性試験対策になるんです。
最初はそれでも構いません。
しかし、いざという時に踏ん張って成功できるかは、日頃から高みに登ろうとする意識と行動が必要、と私は考えています。
もし、合格への粘り強さを身に付けたくなったら、以下も軽く見てみてくださいね。今じゃなくてもOKですよ。
補強 | 補数かの見分け方
「補数を使えば、引き算を足し算でできるから、コンピュータ的にメリットがある」と理解はしたけど、「普通の数なのか、補数なのかってどう判断するの?」と私も思います。
例えば「001は普通の数かな」「100は補数かもなぁ」「111は補数かもなぁ」という具合。
ここでは、2桁と3桁の2進数を例に探ってみましょう。
2桁の2進数で確認
2桁の2進数を挙げますね。
00:10進数の0
01:10進数の1
10:10進数の2
11:10進数の3
それぞれ「補数」にしてみます。
「→各桁ビット反転→+1」で表記します。
00:→11→00
01:→10→11
10:→01→10
11:→00→01
1つずつ見ていきましょう。
00→11→00について。11に+1で100ですが溢れた「1」は無視して「00」とします。「普通の数」00は、「補数」でも00なので、「普通の数」として使います。00は10進数で0なので、わざわざ-0を作る必要もないですからね。
01→10→11について。「普通の数01」は「10進数の1」として、「補数11」は「10進数の-1」として使いましょう。これで「普通の数11」は使えなくなったので、10進数の3は使えなくなりました。
10→01→10について。00と同じで「普通の数」と「補数」が同じになってしまいました。2進数10を「普通の数、10進数の2」として使うか、「補数、10進数の-2」として使うかを考え、「補数、10進数の-2」とします。つまり、「10進数の2」は表現しません。
11→00→01について。「01→10→11」で決めたように、2進数11は「補数、つまり2進数の-11、10進数の-1」として使います。
再度まとめます。
00:「普通の数」:「10進数の0」として
01:「普通の数」:「10進数の1」として
10:「補数」:「10進数の-2」として
11:「補数」:「10進数の-1」として
よって「2桁の2進数(補数あり)」で表現できる範囲は、-2~+1です。
3桁の2進数で確認
次は、3桁の2進数で確認してみます。
「3桁2進数、普通の数」「補数にしてみた」「10進数での役割」の順で挙げますね。
普通の数:補数にした:10進数での役割
000:000:10進数の0
001:111:10進数の1
010:110:10進数の2
011:101:10進数の3
100:100:10進数の-4
101:011:10進数の-3
110:010:10進数の-2
111:001:10進数の-1
よって「3桁の2進数(補数あり)」で表現できる範囲は、-4~+3。
「3桁の2進数(補数なし)」では、0~7ですよね。
数の大小で並べ替えておきます。
100:10進数の-4
101:10進数の-3
110:10進数の-2
111:10進数の-1
000:10進数の0
001:10進数の1
010:10進数の2
011:10進数の3
補強 | 計算してみる
補数なんてうさん臭い数を使って、本当に計算が正しくできるのか確認してみます。
01と11を足して0になるか、01と10を足して-1になるか、なんて信じられないですよね。私もそう思います。
01 + 11 (= 100ですが3桁目は無視)= 00。これは「1 + (-1) = 0」と同じ結果なのでOK。
01 + 10 = 11(補数なので-1のこと)。これは、「1 + (-2) = -1」と同じ結果なのでOK。
ほんと不思議ですよね。でも正しく計算できちゃってますよね。
4桁の2進数で確認
では4桁の2進数を考えてみます。
「0000は、10進数の0として使うから」
0000:10進数の0
「0001は、10進数の1として使いたい」「10進数の-1は、補数で1111を使うでしょう」と考えて、
1111:10進数の-1
0000:10進数の0
0001:10進数の1
この調子で数を考えていきます。
1000:10進数の-8
1001:10進数の-7
~
1111:10進数の-1
0000:10進数の0
0001:10進数の1
~
0111:10進数の7
「最大値と最小値でツジツマが合うか確認」を一応検算してみます。
0111 + 1001 (= 10000ですが5桁目は無視)= 0000。これは「7 + (-7) = 0」と同じ結果なのでOK。
他にも、0111 + 1000 = 1111(補数なので-1のこと)。これは、「7 + (-8) = -1」と同じ結果なのでOK。
補強 | なぜ(n-1)乗なのか
ついでに、なんで2の「n-1」乗なのか。「-1」を考えてみましょう。
答えは、表現できる数は「2のn乗個」ですが、「普通の数」と「補数」で半分半分なので、「2のn乗の÷2」で「2のn-1乗」になるからです。
上図の通り、表現できる個数は「2の2条=4個」です。
なので「普通の数」では、0~3までの4個表現しました。
$$
最大値は2^n-1 \\
= 2^2-1\\
=3
$$
0を表現した分、最大値が4から「-1」だけ下がって3になったんです。
さらに補数を使った場合は、0~3までの4個を、補数2個(-2, -1の役目)と普通の数2個(0, 1)に分けて使います。
$$
2^nから半分になり、\\
\frac{2^n}{2} \\
= 2^{n-1}となります。
$$
>指数のNote で指数計算は詳しく解説しています。
補強のまとめ
補強で、2桁, 3桁, 4桁と3回も確認したのには理由があります。
例えば指数。
2の2乗は4は分かりますよね。2^2=4。
では、2の3乗は何ですか? 2^3=?。
ちゃんと「8」と答えられたでしょうか?
実はIT専門学校の1年生前期試験で、「2^2=4」と正解して、次の問題の「2^3=6」と不正解する学生さんは30%ぐらいいますよ。
2^2は、本来は2を2回掛けるので2×2=4なのですが、式的に2に2を掛けて2×2=4と同じなんですよね。
つまり、2^3を2×3=6として不正解になってるんです。
このように掛け算が絡んだ時に、2だけでなく3でも確認しないと、勘違いしたままになってしまうんです。
ITパスポートでも基本情報技術者試験では、「指数」「対数」「組合わせnCr」「順列nPr」などなど、たくさんの法則・公式を使います。
丸暗記だけでなく、空いた時間に「公式勘違いしてないかな?」「ド忘れしたけど、何とか公式を特定できないかな?」と試すのが、合格への粘り強さにつながります。
土俵際 小指一本。
正解を引き寄せられるかの「一手」、合格へ近づけるかの「一歩」には、メンドウだと思うことに敢えて手を入れ続ける習慣が必要だ、と私は考えています。
まとめ | 補数までは頑張って、「浮動小数点」は捨ててね!
お疲れ様でした!
補数は難しかったですね。
ひとまず、補数に変換するスキルを身に付けましょう。「各桁をビット反転して、+1」ですね。
次に、補数を使った時の表現範囲を、公式「-2^(n-1)-1 ~ +2^(n-1)」か、補強でやった「2桁、3桁で確認」で正解できるようになりましょう。
補数までは頑張ってください。
補数はIT数学の「ラスボス前座」です。ラスボスは「浮動小数点」。
でも「補数」まで捨てると2問も合格から遠のきます。踏ん張りどころです。
さいごに、IT専門学校の先生としての感触を話しておきますね。
計算問題を捨て問にしている方。ITパスポートはそれでも合格できる学生さんはいます。でも5問でも正解できればかなり楽になるので頑張ってみてください。
基本情報技術者試験を取りたい方。計算問題もデジタル署名も正解必須です。恥ずかしながら、IT専門学校で修了試験に合格できない学生さんは、本試験の科目Aを通過することは300名中1名です。
以上になります。
他にも計算問題のNoteはたくさん公開していますので、興味があったら覗いていってくださいね。
それでは!
\力試しは修了試験で!4回分の解説です/
p.s. 普段は >> 専門学校とIT就職のブログ << をやってます。
でわでわ(・ω・▼)ノシ