見出し画像

【FE2問】「固定小数点」形式(基本情報技術者試験)


数値はコンピュータには2進数データとして記録されます。

私たちは、「2」とか「2.5」とか「-2」とか「-2.5」とか気軽にメモをするんですが、コンピュータではいろんな記録形式があります。

そもそも数値には、「正の数」「負の数」「整数」もあれば「小数」もありますね。

正負の記録には、符号部(0なら正、1なら負)を1ビット設けたり、補数を導入した表現があります。>補数の解説Note

また整数なら「10進数の2」を「2進数の10」として、小数を含む実数なら「10進数の2.5」を「2進数の10.1」として記録します。

今回は小数部のある実数の記録方法「固定小数点」形式を学びます。

なお実数の記録は、「固定小数点」形式だけでなく「浮動小数点」形式もあります。>浮動小数点の解説Note

「固定小数点」形式は「浮動小数点」形式よりも簡単なので、ぜひ得点できるようになってくださいね。


それでは始めましょう!





「固定小数点」形式


「固定小数点」形式は、小数点の位置が決まっている数値表現です。

10進数5.5を、8ビット固定小数点形式による2進数で表せ。なお、小数点位置は3ビット目と4ビット目の間とし、0ビット目から数える。

基本情報技術者試験 平成23年秋午前問2より改変

まずコンピュータは2進数を使うので、「10進数の5.5」を2進数に変換しましょう。

  1. 整数部と小数部に分ける:5.5→5と0.5

  2. 整数部を変換する(割り算の方法):5→101

  3. 小数部を変換する(掛け算の方法):0.5→0.1

  4. 整数部と小数部を結合する:101 + 0.1 = 101.1


さて、問題文より「小数点位置は3と4ビット目の間」「0ビット目から数える」なので、整数部は0~3ビット目の4桁・小数部は4~7ビット目の4桁です。

よって、0101.1000とし、ビット列は01011000です。




問題演習 | 補数と絡める


負の数は補数表現を用いることが多いです。

引き算を足し算で実現できるので、コンピュータは加算回路だけ用意すれば良いですから。>補数の解説Note

今回の問題では、補数変換をするタイミングに注意してください。

10進数-5.625を、8ビット固定小数点形式による2進数はどれか。なお、小数点位置は3ビット目と4ビット目の間とし、0ビット目から数える。負の数は補数表現を用いる。

ア:0100 1100
イ:1010 0101
ウ:1010 0110
エ:1101 0011

基本情報技術者試験 平成23年秋午前問2より改変

正答はウ。


流れは以下3段階です。

  1. 5.625を2進数に変換する

  2. 整数部4桁、小数部4桁に整形する

  3. 負の数なので、5.625の2進数を補数に変換する

桁数の整形をした後に補数変換をするのが注意点。

なぜなら、補数変換では各桁をビット反転を行うため、1を反転すれば「0」ですが、01を反転すれば「10」のように結果が全然違ってきます。


まずは、5.625を2進数に変換します。

  1. 整数部と小数部に分ける:5.625→5と0.625

  2. 整数部を変換する(割り算の方法):5→101

  3. 小数部を変換する(掛け算の方法):0.625→0.101

  4. 整数部と小数部を結合する:101 + 0.101 = 101.101


次は、整数部4桁、小数部4桁に整形します。

101.101→0101.1010


最後に-5.625は負の数なので補数に変換します。

  1. 各桁をビット反転する:0101.1010→1010.0101

  2. (最下位ビットに)+1する:1010.0110

したがってビット列は「1010 0110」。




問題演習 | 表現範囲


16ビット固定小数点形式の最小値はどれか。ただし負の数は補数で表現し、2進数のビット列は16進数で表記している。

ア:7FFF
イ:8000
ウ:8001
エ:FFFF

基本情報技術者試験 平成18年秋午前問05より改訂

正答はイ。



正の数のみならば簡単だが


補数を使わなければ、正の数のみなので以下になります。

  • 最大値:1111 1111 1111 1111:FFFF

  • 最小値:0000 0000 0000 0000:0000

しかし負の数が表現できる場合は、負の数が最小値になり、補数表現を考えて特定せねばなりません。



補数のビット列の傾向


2ビットの場合の補数の表現範囲を図示します。

最小値は、「2進数の10」。補数であり「10進数の-2」の役割を持ちます。

図の2進数をじっとみると、16ビットの最小値は「1000 0000 0000 0000」かなと推測できます。



解き方1


補数「1000 0000 0000 0000」が10進数でいくつなのか。なお、小数点の位置は明記がないため、とりあえず右端として整数のみと考えてOKです。

補数を「普通の数」に変換する手順は、「普通の数→補数」の手順と同じ。不思議ですね。

  1. 各桁ビット反転して:0111 1111 1111 1111

  2. (最下位に)+1して:1000 0000 0000 0000


最後に16進数に変換します。

2つの方法がありますが、2つ目を薦めます。

  • 2進数→10進数→16進数

  • 2進数4桁→16進数1桁

2進数の「1000 0000 0000 0000」を4桁ずつ16進数1桁に変換して「8 0 0 0」。よって正答はイ「8000」。



解き方2


各選択肢の値を比べてみましょう。

まずは16進数から2進数にして、補数かどうか見ます。最上位ビットが「1」なら補数です。>補数の解説Note

  • ア:7FFF:0111 1111 1111 1111:正の数

  • イ:8000:1000 0000 0000 0000:補数(負の数)

  • ウ:8001:1000 0000 0000 0001:補数(負の数)

  • エ:FFFF:1111 1111 1111 1111:補数(負の数)

この時点で、アは正の数、イ~エが負の数なので、最小値はイ~エのどれかです。


イ~エの値を比べるために、補数から「普通の数」に変換します。

イについて。1000 0000 0000 0000→0111 1111 1111 1111→1000 0000 0000 000:10進数の2^15なので、「-2^15」

ウについて。1000 0000 0000 0001→0111 1111 1111 1110 →0111 1111 1111 1111:イより1だけ絶対値小さいので、2^15 -1、「-2^15+1」。負の数なので+1です。「-4」を「-3」にするようなもの。

エについて。1111 1111 1111 1111→0000 0000 0000 0000→0000 0000 0000 0001:10進数の1なので、「-1」。

したがって、イが最小値。


固定小数点の問題というよりは、補数の表現範囲の問題でしたね。



補強 | 小数点位置を考えなくて良かったのか


「解き方1」で「なお、小数点の位置は明記がないため、とりあえず右端として整数のみと考えてOKです」と書きましたが、少し考えてみます。


簡単のため4ビット、補数表現なし(正の数のみ)で考えます。

  • 最小値:0000:10進数の0

  • 最大値:1111:10進数の15

では小数点位置が、3ビット目と4ビット目の間だったら。

  • 最小値:000.0:10進数の0

  • 最大値:111.1:10進数の7.5

このように、最小値と最大値のビット列はそのままで、意味する値だけが変動し、大小関係はそのままです。

16ビットの時も、小数点位置がどこであろうと最小値のビット列は同じなので、小数点位置を勝手に決めて解きました。




まとめ


お疲れ様でした!


固定小数点表示は簡単なので、16進数や補数を絡めて難易度を高める小細工をしている印象でしたね。

「補数」は少しハードルがありますが、ラスボスの浮動小数点よりはマシなので、少しでも解けるようになってくださいね。


他にも計算問題のNoteはたくさん公開していますので、興味があったら覗いていってくださいね。

それでは!

\力試しは修了試験で!4回分の解説です/


p.s. 普段は >> 専門学校とIT就職のブログ << をやってます。

でわでわ(・ω・▼)ノシ


いいなと思ったら応援しよう!

せんない
学習方法・問題特集のNoteは全て無料提供を続けます▼ もしご覧になったNoteが有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼ もちろんコメントでも結構です(・ω・▼)ノシ

この記事が参加している募集