![見出し画像](https://assets.st-note.com/production/uploads/images/144972385/rectangle_large_type_2_de72545cb4f5ead89c20763fd53111c0.png?width=800)
【FE6問】「補数」問題を集めてみた(基本情報技術者試験、ITパスポート)
補数は難しいですよね。
簡単に言うと「2桁の2進数の11」は「普通の数」では「10進数の3」として使われます。しかし「補数」も使うなら「10進数の-1」として使うようになります。
「補数を使う」と決めたら、2進数の役割が変わるんです。
2進数:10進数(普通の数):10進数(補数も使う場合)でまとめます。
00:0:0
01:1:1
10:2:-2
11:3:-1
「補数」を使う場合は、10と11の役割が変わっています。
![](https://assets.st-note.com/img/1719108050207-FBxOLZ5tlB.png?width=800)
計算してもツジツマが合うんですよ。
「普通の数」の場合は、01+10 = 11(10進数の3)。これは異論ないですよね。
「補数」を使う場合は、01+10 = 11と見た目は同じですが、11は10進数の-1なので、実質「1 + (-2) = -1」をしています。
確かに、01は「10進数の1」、10は「10進数の-2」なので、計算結果の11が「10進数の-1」になっているのは、ちゃんとツジツマが合っています。不思議ですよね。
さて以下3点が分からなかったら、>補数の解説Note で基礎を固めてください。
補数への変換方法:各桁ビット反転して+1
補数を使うと引き算が足し算で実現できる
表現範囲:-2^(n-1) ~ +2^(n-1)-1
自信なくてもちょっと分かる感じだったら、読み進めて問題演習をしてみましょう。
それでは始めますね!
基数変換
補数問題を解くには、2進数問題のいろんな知識が必要です。
2進数から10進数の変換を整数だけ、実数(小数含み)を理解して「正の数」について理解してから、やっと「負の数(補数)」の問題に挑戦できるようになります。
10進数⇔2進数
基本の復習です。流し読みでささっと済ませてOKです。
10進数の155を、2進数に変換したものはどれか。
ア:10011011
イ:10110011
ウ:11001101
エ:11011001
正答はア。
10進数から他の進数への変換は、割り算の繰り返しで行います。
![](https://assets.st-note.com/img/1719109691971-49Qj3EsJFv.png?width=800)
せっかくなので、逆変換も復習しましょう。
他の基数から10進数への変換は、各桁の数値と各桁の重みを掛け算して行います。
![](https://assets.st-note.com/img/1719110422304-XuqkoR77r3.png?width=800)
「2の0乗」は「1」なのに注意してください。よく「0」と計算してしまう学生さんがいます。詳しくは >指数の解説Noteへ
以上の方法をマスターすれば、8進数や16進数も取り扱えます。
小数の変換
10進数から2進数の変換は割り算を繰り返し行いましたが、実は整数しか変換できません。
10進数の小数を、2進数の小数に変換するには、掛け算を繰り返して行います。
例えば10進数5.625を2進数に変換する時は、5を割り算で変換し、0.625を掛け算で変換し、最後に結合します。
まずは、整数部の5を2進数に変換して「101」を得ます。
![](https://assets.st-note.com/img/1719110914301-kHWF0p7hGp.png?width=800)
次に小数部「0.625」を2進数に変換して「0.101」を得ます。
![](https://assets.st-note.com/img/1719111306424-r2mGy4vdBG.png?width=800)
最後に結合するので、101+0.101 = 101.101
以上より、「10進数の5.625」は「2進数で101.101」に変換できました。(後で、-5.625の2進数変換で使います)
「補数」は「負の数」
補数は負の数を表現する特別な数です。
![](https://assets.st-note.com/img/1719108256619-F6cUrsiZW1.png?width=800)
例えば、2桁の「2進数11」は普通の使い方では「10進数の3」ですが、補数を導入すると「10進数の-1」として使います。
補数を使うと、2進数の引き算を、2進数の足し算に統一できるので、コンピュータに足し算回路を用意するだけで足し算も引き算もできて便利になります。
![](https://assets.st-note.com/img/1719108286161-cMmLRIZhvj.png?width=800)
例えば、2進数の引き算で「01 - 01 = 00」は、補数でを使えば「01 + 11 = 00」とできます。コンピュータの「桁から溢れた繰り上がりを無視する」特性を利用しています。
詳しくは >補数の解説Noteへ
「普通の数」と「補数」の相互変換
「普通の数」を「補数」に変換、「補数」を「普通の数」に逆変換は、同じ変換手順でできます。不思議ですね。
2進数各桁の0, 1をビット反転させる。
上記に+1する
![](https://assets.st-note.com/img/1719108083720-4O7chGtzKl.png?width=800)
3桁の2進数001(10進数の1)から、補数(10進数の-1)に変換するには、001の各桁をビット反転して110、+1して111となります。2進数111は補数であり10進数の-1の役割をします。
逆に2進数111(補数)を「普通の数」に変換するのも同じ手順。11の各桁をビット反転して000、+1して001。元に戻りましたね。
補数の見分け方は最上位が「1」
最上位が「1」の時は、補数です。
「2進数11」は補数で、「10進数の-1」の役割
「2進数10」も補数で、「10進数の-2」の役割
普通の基数変換では、
「2進数の11」は「10進数の3」
「2進数の10」は「10進数の2」
なので、全然違います。
![](https://assets.st-note.com/img/1719108034680-caIZsJ6Fwm.png?width=800)
補数が「マイナス何」なのかを知るには、「補数」から「普通の数」に戻す必要があります。
「2進数11(補数)」なら、ビット反転して00、+1して01が「普通の数」で、「10進数の1」ですよね。よって、マイナス符号をつけて「2進数11(補数)」は「10進数の-1」なんだと分かります。
補数が導入された2進数の負数10101110の絶対値はどれか。
ア:01010000
イ:01010001
ウ:01010010
エ:01010011
正答はウ。
補数を「普通の数」にすればOKです。
補数10101110を、ビット反転して01010001、+1して01010010で「普通の数」になりました。正答はウ。
2進数の01010010は、10進数の82
補数の10101110は、10進数の-82の役割
ということでした。
総合問題1
10進数-5.625を、8ビット2進数で表したものはどれか。なお、固定小数点形式で、小数点は3ビット目と4ビット目の間である。負数は補数表現を用いるとする。
ア:01001100
イ:10100101
ウ:10100110
エ:11010011
正答はウ。
このNoteの最初で「10進数の5.625」を「2進数の101.1010」に変換しました。桁を合わせて「0101.1010」としておきます。
今回は負の数「-5.625」なので補数に変換します。
01011010の各桁をビット反転して10100101、+1して10100110。
よって正答はウ。
ここで注意点。0101.1010の「+1」するときに小数点に注目して0110.1010ではないです。最下位ビットに+1します。
今まで簡単のために、「最下位ビットに+1」を単に「+1」、「(2進数の)2の補数」を単に「補数」と書いてきました。
総合問題2
「ある2進数」の最下位2ビットが「11」のとき、「ある2進数」を10進数の4で割った時の余りはどれか。なお2進数「11」が、負の数なら補数で表現しているとする。
ア:「ある2進数」が正ならば、余りは3。
イ:「ある2進数」が負ならば、余りは-3。
ウ:「ある2進数」が負ならば、余りは3。
エ:「ある2進数」が正でも負でも、余りは0。
「ある2進数」の最下位2ビットが「11」なので、考えられる数は、
3桁の2進数なら
011(正の数)
100(負の数)
4桁の2進数なら
0011(正の数)
0111(正の数)
1011(負の数)
1111(負の数)
などがあります。
それぞれ、10進数にして4で割ってみましょう。ただし「負の数」は「補数」を「普通の数」に変換してから10進数に変換します。
011:10進数の3:0余り3
100→100:10進数の-4:-1余り-1
0011:10進数の3:0余り3
0111:10進数の7:1余り3
1011→0101:10進数の-5:-1余り-1
1111→0001:10進数の-1:0余り-1
以上より、
「ある2進数」が正の時、余り3
「ある2進数」が負の時、余り-1
以上より正しいのは、「ア:ある2進数が正ならば、余りは3」だけです。負なら余り-1の選択肢がないですからね。
なお、5桁の2進数や6桁の2進数も気になりますが、6個も確認したから大丈夫でしょう。
補数の表現範囲
補数を使った2進数の表現範囲:
-2^(n-1) ~ +2^(n-1)-1
※「^」は指数計算を意味します。
![](https://assets.st-note.com/img/1719108106512-xLm67yzJAk.png?width=800)
例えば、2桁の2進数では、-2~+1。3桁の2進数では、-4~+3が表現範囲になります。
100:10進数の-4
101:10進数の-3
110:10進数の-2
111:10進数の-1
000:10進数の0
001:10進数の1
010:10進数の2
011:10進数の3
2桁の11は「補数」で-1の役割、3桁の011は同じ意味かと思いきや「普通の数」で3の役割で違うんです。不思議ですね。
8桁の2進数で表現できる範囲はどれか。なお、負の数を補数で表現する。
ア:-256~255
イ:-255~256
ウ:-128~127
エ:-127~128
正答はウ。
公式「-2^(n-1) ~ +2^(n-1)-1」を使います。
最小値(負の数)は、-2^(n-1) = -2^(8-1) = -2^(7) = -128。2進数では、1000 0000です。
最大値(正の数)は、+2^(n-1)-1 = +2^(8-1)-1 = +2^(7)-1 = 127。2進数では、0111 1111です。
総合問題3
補数を導入した16ビット2進数の最小値を表すビット列を、16進数で表したものはどれか。
ア:7FFF
イ:8000
ウ:8001
エ:FFFF
16ビットの最小値は、補数が導入されているので、1000 0000 0000 0000です。
あとは2進数から16進数に変換すれば良いです。
変換は2通りありますが、2進数4桁→16進数1桁の直接変換が簡単です。
2進数→10進数→16進数
2進数4桁→16進数1桁
2進数を4桁ずつに区切り「1000 0000 0000 0000」、4桁を16進数に変換します。
「1000」は「10進数の8」なので、16進数でも8です。「0000」は「16進数の0」ですね。
まとめ
お疲れ様でした!
補数の理解が、ただでさえ難しいところに、整数と小数の基数変換も交じってきたりして大変でしたよね。
補数は、浮動小数点の次に難しい問題です(浮動小数点は捨ててOK)。
補数問題は、全て解けなくても構わないですが、少しは解けるようになってください。
「普通の数」から「補数」の変換:桁別にビット反転して+1
「補数」の表現範囲:-2^(n-1) ~ +2^(n-1)-1
以上2点だけのシンプルな問題だけでもOKです。
少しでも計算問題が解ければ、合格点にぐぐっと近づきます。計算問題を全部捨てると、60%正答の合格ラインが70%, 75%と上がっていきます。
自らハンデを背負おうようなものなんです。
計算問題に特化したNoteも準備したので、解けそうな問題を探してみてくださいね。
\力試しは修了試験で!4回分の解説です/
p.s. 普段は >> 専門学校とIT就職のブログ << をやってます。
でわでわ(・ω・▼)ノシ
学習方法・問題特集のNoteは全て無料提供を続けます▼ もしご覧になったNoteが有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼ もちろんコメントでも結構です(・ω・▼)ノシ