基本情報技術者

【基本情報技術者試験】基数と基数変換

2021年8月14日

次の問題は基本情報技術者試験で過去に出題された問題です。この問題の解き方わかるかな?

わかりません・・・

問題

10進数の演算式7÷32の結果を2進数で表したものはどれか。

ア:0.001011 イ:0.001101 ウ:0.00111 エ:0.0111

基本情報技術者平成31年春期 午前問1

基本情報技術者試験の参考書を読むと大抵はじめに出てくる内容である「基数」と「基数変換」、2進数?16進数?と普段の生活では使わない言葉がでてくるため、ここで挫折してしまう人も多いのではないでしょうか。

本記事では「基数」と「基数変換」について図解で分かりやすく解説していきます。

本記事で学べること

  • コンピュータの基本である基数を理解
  • 「2進数→10進数」などの基数変換のやり方をマスター
  • 基本情報技術者試験の過去問の解き方を学ぶ

基数

基数とは、数値を表現する際に位取りの基準となる数のことであり、2進数や10進数などの「n進数」のnの部分を基数といいます。

スポンサーリンク

2進数

2進数とは「0」と「1」という2個の数字であらわしたものです。

コンピュータが扱う最小単位のことをビット(bit)といい、1ビットで表現できる数字は「0」と「1」の2つだけです。この「0」と「1」という2個の数字で数をあらわすのが2進数です。

そして、コンピュータの世界では 1バイト(Byte)= 8ビット(bit)と定義されています。

1ビットと1バイト

コンピュータはこの「0」と「1」の集まりしか理解できません。そのため、コンピュータでは「0」と「1」の集まりでデータを表現します。

でもコンピュータは「A」のような文字を表現していますよね?
コンピュータが文字を理解できているのは「文字コード」と呼ばれる文字と2進数の対応表があるからです。

文字コードとは

コンピュータに文字を表現させているのは「文字コード」と呼ばれるものです。

コンピュータが理解できる「0」と「1」の集まりと、文字の対応表を作り コンピュータはその対応表通りに文字を表現しています。

8進数と16進数

コンピュータの基本は2進数です。しかし「0」と「1」しか使えない表記だと、桁数が膨大になってしまいます。そこで1桁である程度まとまった区切りができ、コンピュータと相性の良いn進数表記が必要です。それが8進数と16進数です。

8進数は0~7の8通りの数で表現します。8進数の1桁は2進数の3桁(3ビット)と同じ情報量です。

8進数

そして、16進数は0~Fの16通りの数で表現します。16進数の1桁は2進数の4桁(4ビット)と同じ情報量です。

16進数

2進数と8進数、16進数の対応表は次のとおりです。

10進数2進数8進数16進数
0000
1111
21022
31133
410044
510155
611066
711177
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F
16100002010

10進数

私たち人がものを数える時には、0~9という10個の数字を使います。この0~9という10個の数字で数をあらわすのが10進数です。

2進数とは

基数変換

スポンサーリンク

基数と桁の重み

10進数から2進数へ変換するときなどの使うのが「桁の重み」です。

桁の重みとは、各桁の単位のことで、10進数で例えると「100の位」「10の位」「1の位」など、「~の位」を桁の重みといいます。

n進数の桁の重みは次の法則で決まります。(整数部3桁、小数部3桁の例)

桁の重み

10進数で見てみると、桁が増えるごとに10倍ずつ増えているのがわかります。

10進数の桁の重み

2進数、8進数、16進数も同じ考え方です。以下は2進数の桁の重みです。桁が増えるごとに2倍ずつ増えています。

桁の重み2進数

n進数から10進数への基数変換

例題

2進数「1011.001」を10進数に変換せよ。

n進数を10進数に変換するには、各桁に対して「桁の重み」を掛け、それを合算することで求めることができます。

2進数から10進数への変換

上記は2進数「1011.001」を10進数へ変換するイメージ図です。

2進数→10進数への変換

2進数に各桁の重みを掛け、その値を合算すると10進数になる

式:1×8 + 1×2 + 1×1 + 1×1/8 = 11.125

※0は掛け算しても必ず0になるので、1の部分だけを計算して合算する

10進数からn進数への基数変換

例題

10進数「11.125」を2進数に変換せよ。

10進数をn進数に変換するには、次のように10進数の整数部を基数で割っていきます。(今回の例は2進数への変換なので2で割る)

10進数から2進数への変換方法

10進数(整数)→2進数への変換

  • 10進数の整数部を「2」で割っていく
  • 商が「0」になるまで処理1を繰り返す
  • 処理1~2で求めた、割り算の余りを下から読むと2進数になる

続いては小数部です。次のように10進数の小数部に対して基数を掛けていきます。(今回の例は2進数への変換なので2を掛ける)

10進数から2進数への変換 小数部

10進数(小数)→2進数への変換

  • 小数部分に「2」を掛ける
  • 処理1の計算結果に対して、また「2」を掛ける ※小数部分が「0」のときは終了
  • 小数部分が「0」になるまで処理2を繰り返す
  • 処理1~3で求めた計算結果の、小数点より前の数値を上から並べると2進数になる
最後に整数部と小数部で求めた値を連結させれば完了です。

10進数「11.125」→ 2進数「1011.001」

2進数から8進数への基数変換

例題

2進数「1011」を8進数に変換せよ。

2進数を8進数に変換するには、次の3ステップを実施します。

2進数→8進数への変換

  • 2進数を3桁ごとに区切る
  • 区切り単位で10進数に変換する
  • 処理2で求めた10進数を連結する

2進数から8進数への変換方法

[ステップ1] 2進数を3桁ごとに区切る

1011

001 と 011 に分ける

※3桁ない場合は0で補う

[ステップ2] ステップ1で区切った、区切り単位で10進数に変換する

2進数「001」→ 10進数「1」

2進数「011」→ 10進数「3」

[ステップ3] ステップ2で求めた10進数を連結する

10進数「1」と「3」を連結する

8進数「13」

2進数から16進数への基数変換

例題

2進数「10011011」を16進数へ変換せよ。

2進数を16進数に変換するには、次の4ステップを実施します。

2進数→16進数への変換

  • 2進数を4桁ごとに区切る
  • 区切り単位で10進数に変換する
  • 処理2で求めた10進数を16進数表記にする
  • 処理3で求めた16進数を連結する

2進数から16進数への変換方法

[ステップ1] 2進数を4桁ごとに区切る

10011011

1001 と 1011 に分ける

※4桁ない場合は0で補う

[ステップ2] ステップ1で区切った、区切り単位で10進数を求める

2進数「1001」→ 10進数「9」

2進数「1011」→ 10進数「11」

[ステップ3] ステップ2で求めた10進数を16進数表記にする

10進数「9」→ 16進数「9」

10進数「11」→ 16進数「B」

[ステップ4] ステップ3で求めた16進数を連結する

16進数「9」と「B」を連結する

16進数「9B」

8進数から2進数への基数変換

例題

8進数「15」を2進数に変換せよ。

8進数から2進数に変換するには、次の3ステップを実施します。(2進数から8進数を求めた時と逆のことをする)

8進数→2進数への変換

  • 8進数をバラバラにして10進数に戻す
  • 処理1で求めた10進数を2進数に変換する
  • 処理2で求めた2進数を連結する

[ステップ1] 8進数をバラバラにして10進数に戻す

8進数「15」

10進数「1」と「5」

[ステップ2] ステップ1で求めた10進数を2進数に変換する

10進数「1」→ 2進数「001」

10進数「5」→ 2進数「101」

※3桁の2進数にする(3桁ない場合は0で補う)

[ステップ3] ステップ2で求めた2進数を連結する

2進数「001」と「101」

2進数「001101」

16進数から2進数への基数変換

例題

16進数「9B」を2進数に変換せよ。

16進数から2進数に変換するには、次の3ステップを実施します。(2進数から16進数を求めた時と逆のことをする)

16進数→2進数への変換

  • 16進数をバラバラにして10進数に戻す
  • 処理1で求めた10進数を2進数に変換する
  • 処理2で求めた2進数を連結する

[ステップ1] 16進数をバラバラにして10進数に戻す

16進数「9B」

10進数「9」と「11」

[ステップ2] ステップ1で求めた10進数を2進数に変換する

10進数「9」→ 2進数「1001」

10進数「11」→ 2進数「1011」

※4桁の2進数にする(4桁ない場合は0で補う)

[ステップ3] ステップ2で求めた2進数を連結する

2進数「1001」と「1011」

2進数「10011011」

スポンサーリンク

基本情報技術者試験 過去問の解説

問題

10進数の演算式7÷32の結果を2進数で表したものはどれか。

ア:0.001011 イ:0.001101 ウ:0.00111 エ:0.0111

基本情報技術者平成31年春期 午前問1

それでは基本情報技術者試験の過去問の解き方を解説していきます。

【解き方その1】シンプルに計算する

まずは10進数で割り算を行います。

10進数の計算:7 ÷ 32 = 0.21875

これを2進数に変換します。

0.21875 × 2 = 0.4375

0.4375 × 2 = 0.875

0.875 × 2 = 1.75

0.75 × 2 = 1.5

0.5 × 2 = 1.0

小数点より前の値を上から並べると「0.00111」になる

答えは「ウ」です。ただもっと簡単に計算できる方法があります。それが次の「シフト演算」を使う方法です。

【解き方その2】シフト演算を使う

シフト演算とは、2進数をあらわすビット列を左または右にずらす操作のことです。

例えば、10進数の「7」という数字を10倍(左にシフト)すると「70」、1/10倍(右にシフト)すると「0.7」です。

この操作は2進数でも同じであり、「1」(10進数:1)という2進数を2倍(左にシフト)すると「10」(10進数:2)になり、1/2倍(右にシフト)すると「0.1」(10進数:0.5)です。

シフト演算の例

このように、ビット列を左にずらす(左にシフト)と元の値の2倍右にずらす(右にシフト)と元の値の1/2倍という計算結果を簡単に得ることができます。コンピュータはこのシフト演算を使い、掛け算や割り算を行っています。

このシフト演算を使うことで、簡単に計算することができます。

7÷32の「7」を2進数に変換すると「111」、さらに「32」を2の累乗で表現すると「25」になります。今回は割り算なので「111」を「1/25」倍すれば答えを求めることができます。

「1/25」なので、次のように右に5ビットシフトすると「0.00111」となり、10進数の演算式「7÷32」の結果を2進数で求めることができました。

右に5ビットシフト

helpful