8進数について。2進数との関係が重要です。

8進数について。2進数との関係が重要です。

悩み:

ITエンジニアとし基礎力をつけたいと、基本情報技術者試験の勉強を始めた。
しかし、「8進数の55を2進数で表すと?」という問題に遭遇し、何から手をつけていいか分からん。挫折しそう、、、
そもそも、8進数って知らないとけないのかなぁ、、、

結論:

8進数は知っておいた方が良いです。
なぜなら、
①ITエンジニアとしてn進数の理解はとても重要だから。
②基本情報技術者試験でよく聞かれるから。
です。

信頼性:

IT業界に転職して約1年。ITエンジニアとしての基礎力をつけたいと思い、 2021年2月より基本情報技術者試験の学習を始めました。4月に受験するも不合格。そして、6月に受けた試験で合格する事ができました。

この記事を読むとできるようになる事:

  • 8進数の理解ができる。
  • 8進数と10進数の基数変換ができる。
  • 8進数と2進数の関係を理解でき、基数変換できる。


ITエンジニアとして、n進数の理解は避けては通れないもの。

そのため、基本情報技術者試験でもn進数はよく聞かれます。

特に試験上重要なのが、

  • 2進数
  • 8進数
  • 10進数
  • 16進数

の4つです。

今回、得意に重要なのは、「8進数と2進数の関係」についてです。
8進数と2進数の関係の理解、基数変換ができるようになれば良いかなと思っています。

※n進数、2進数の理解を前提としています。合わせてこちらの記事をご覧下さい。
2進数と10進数の変換方法を克服しよう!基本情報技術者試験でエンジニアとしての基礎力をつける


なお、冒頭の「8進数の55を2進数で表すと?」の答えは、「101 101」です。

解答
二桁目の「5」の計算
5 ÷ 2 = 2 ・・・ 1 ↑
2 ÷ 2 = 1 ・・・ 0 ↑
1 ÷ 2 = 0 ・・・ 1 ↑

= 101

一桁目の「5」の計算
5 ÷ 2 = 2 ・・・ 1 ↑
2 ÷ 2 = 1 ・・・ 0 ↑
1 ÷ 2 = 0 ・・・ 1 ↑

= 101

二桁目と一桁目を合わせて、101101となります。

解答方法の詳しいやり方は、「5. 2進数と8進数の基数変換」をご覧ください。


n進数の世界

n進数を理解することは、n進数の世界を理解することです。

それでは、n進数の世界を覗いてみましょう!

n進数とは何か?

まず、n進数とはなんでしょうか?

n進数を一言で述べると、

n進数とは、「この世の数字はn個の数字によって表現されている」と言えます。

n個の数字とあることから、nには数字が入ります。

8進数の世界

n進数はn個の数字によって表現された世界。

そのため、nに8を入れれば8進数となります。

そして、8進数とは8個の数字で表現された世界。

つまり、この世の数字を、0,1,2,3,4,5,6,7 の8個の数字だけで表現された世界です。

10進数の世界

理解のために10進数で考えてみましょう。

普段私たちは、 10進数の世界で生きています。

10進数とは10個の数字だけで表現された世界です。

つまり、

0,1,2,3,4,5,6,7,8,9,の10個です。

これ以外に数字を使っていますでしょうか?

n進数の理解とは、見えている世界が違うと理解すること

桁上がり(けたあがり)

桁上がりを一言で言うと、

「桁上がりは少ない数の数字で大きな数字を表現できるとても便利なもの。」

これだけ聞いても分かりにくいと思いますので、まずは10進数で考えてみましょう
(10進数はこの世の数字を0~9の10個の数字で表現します)。

普段私たちは、大きな数字を表現するときに、一の位、十の位、百の位、千の位、、、と「位(桁)」という概念を持ち出して大きな数字を表現しています。

10進数であれば、一の位は、0~9となり、9の次は十の位が出現します。

一の位 0→1→2→3→4→5→6→7→8→9 → 十の位出現

十の位と一の位 10→11→12→13→14→15→中略→98→99 → 百の位の出現

百の位と十の位と一の位 100→101→103→中略→998→999→ 千の位の出現 1000~9999…

と、各位(桁)が最大数字の9まで来たら次の位(桁)が出現します。

これを「桁上がり」といいます。

こうして大きい数字を表現しています。

桁上がりとは、「すくない数の数字(10進数であれば0~9の10個)で大きな数字(位(桁)という概念で)を表現できるとても便利なもの」

8進数の桁上がり

8進数は、0~7の8個の数字によって表現されいます。

その為、最大数字の7の次に新しい桁が出現します。

一桁目
0→1→2→3→4→5→6→7→ 二桁目の出現

一桁目と二桁目
10→11→12→13→14→15→16→17→20→21→中略→26→27→30→31→中略→76
→77→ 三桁目の出現

一桁目と二桁目と三桁目
100→101→102→中略→376→377→400→401→中略→775→776→777→ 四桁目の出現 1000→1001…

黄色のアンダーラインは、最大数字の「7」の次に、次の桁の数字が1つ増えていることを表しています。
この感覚に慣れることが大事かなと思います。

ここで、8進数と10進数を比較してみましょう

8進数 10進数
0
1
2
3
4
5
6
7
10(桁上がり)
11
12
13
14
15
16
17
20
0
1
2
3
4
5
6
7
8
9
10(桁上がり)
11
12
13
14
15
16

10進数と8進数の基数変換をしよう!

ここでは、基数変換を克服するための手順について解説します。

基数変換を習得する3つの手順

      1.整数部と小数部を分ける
      2.8進数から10進数へのパターン、10進数から8進数へのパターンがあることを理解する
      3.全部で4つのパターンがあるこを知り、紙とペンを用意し手を動かす。

1.整数部と小数部に分ける。

まずは、数字を整数部と小数部に分けます。

整数部とは、小数点の左側。

小数部とは、小数点の右側です。

例えば、552.125の場合。

整数部は、552。小数部は、 0.125です。

2.4つのパターンを押さえる

整数部と小数部に分けたら、それぞれに、 10進数から8進数へのパターン、8進数から10進数へのパターンを適用しましょう。

これを、まとめると以下のマトリクスになります。

  

整数部 小数部
10進数から8進数
8進数から10進数

それでは、実際に①〜④の順で例題を基数変換していきましょう。

ここでは、例題として、10進数では、「110.453125」、8進数では、「156.35」を使っていきます。

2つとも同じ数字を指しています。

①10進数の整数部「110」を8進数「156」に変換

1、整数部を8で割り、商と余を算出する。
(8で割るのは、8進数だからです。)

110 ÷ 8 = 13(商)・・・6(余)

2、算出した商をさらに8で割って行きます。
(この場合、13をさらに8で割ります。)

110 ÷ 8 = 13・・・6
 13 ÷ 8 =  1・・・ 5

3、2を繰り返し、商が0になるまで行います。

110 ÷ 8 = 13・・・ 6
 13 ÷ 8 = 1 ・・・5
  1 ÷ 8 = 0・・・ 1
(ここで、商が0となりました。計算終了です。)

4、余を下から並べたら、8進数の出来上がりです。

110 ÷ 8 = 13・・・6 ↑
 13 ÷ 8 =  1 ・・・5 ↑
  1 ÷ 8 =  0 ・・・1 ↑

= 156

②10進数の小数部「0.453125」を8進数「0. 35」に変換する

1、10進数の小数部に8を掛け算します。
(8を掛けるのは8進数だからです)

0.453125 × 8 = 3.625000

2、1で算出した答えの整数部と小数部の内、整数部をメモし、小数部に8を掛けます。

0.453125 × 8 = 3.625・・・整数部→3

3、2を繰り返し、小数部が0になるまで行います。

0.453125 × 8 = 3.625・・・整数部→3 (小数部0.625)
0.625  ×  8 = 5.000 ・・・整数部→5
(小数部が0となったので、ここで終了です。)

4、メモした整数部の値を上から順番に並べたら、小数部における8進数の出来上がりです。

0.453125 × 8 = 3.625 ・・・整数部→3 ↓
0.625  ×  8 =5.000 ・・・整数部→5 ↓

=0. 35

となります。

③8進数の整数部「156」から10進数「110」に変換する。

1、整数部「156」の各桁に8nを掛けます。
nは、0からスタートし、各桁が上がるごとに1ずつ増やして行きます。

1   5   6
×   ×   ×
82  81  80

2、ここで8nを変換してみましょう。

80 = 1 (どんな数字に0乗を掛けても、「1」となると覚えておきましょう)
81 = 8
82 = 64

となりますね。

3、計算結果を全て足し合わせたら10進数「110」の出来上がりです。

 1     5     6
 ×     ×     ×
 64    8     1
 ||     ||     ||
64  +  40  +  6  =  110

④8進数の小数部「0.35」を10進数「0.453125」に変換する。

1、小数部「35」の各桁に1/8nを掛けます。

nは、1からスタートし、桁が下がるごとに1ずつ増やして行きます。

 0 .   3     5
     ×     ×
   1/81  1/82

2、ここで、1/8n を変換してみましょう

1/81 = 1/8 = 1 ÷ 8 = 0.125
1/82 = 1/64 = 1 ÷ 64 = 0.015625

3、計算結果を全て足し合わせたら10進数「0.453125」の出来上がりです

 0 .  3         5
    ×         ×
  0.125     0.015625
  ( 1/81 )     (1/82 )
    ||         ||
  0.375  +  0.078125  =  0.453125

全部で4つのパターンがあるこを知り、紙とペンを用意し手を動かす

先ほどの、マトリクスをまとめるとこんな感じです。

  

整数部 小数部
10進数から8進数 ①8で割り算・余を下から  ②8で掛け算・整数部を上から 
8進数から10進数 ③8nで掛け算(nは桁が上がるごとに1ずつ増) ④1/8nで掛け算(nは桁が下がるごとに1ずつ増える)

4つのパターンを知ったところで、実際に紙とペンを用意して手を動かして、先ほどの例題を実際に基数変換してみましょう。

例題
10進数「110.453125」
8進数 「156.35」

3回ほど繰り返せば、もう基数変換は怖くはありません。

コンピュータは電気で動く

コンピュータの動力は電気です。

そして、電気はONとOFFの2択

そのため、電気で動くコンピュータの考えもまた2択と言えます。つまり、0と1で表現される2進数の世界で生きていると言えます。

だから、 コンピュータを理解するにあたり、ITエンジニアにとって2進数の理解はとても重要なのです。

2進数と8進数の関係性を理解する

8進数は2進数と相性が良いです。

なぜなら、8は23で表現できるから。

これは、2進数の「000〜111」が、8進数の「0〜7」に対応しています。

つまり、8進数の1桁は、2進数の3桁分ということです。

試しに、2進数「111」を、8進数にしてみましょう。

ここでは、10進数を経由して変換します。

まず、2進数「111」を10進数にしてみましょう。

 1    1    1
 ×    ×    ×
 22    21   20
 ||     ||   ||
 4  +  2  +  1  =  7

10進数「7」が求められました。

そして、10進数の7は、8進数でも「7」ですね。

(ちなみに、8進数から10進数への変換)
8 ÷ 7 = 0・・・7

2進数と8進数の関係がわかりました。

では、なぜ23で表現するのでしょうか?

それは、人間にとって読みやすくするためです。

例えば、

2進数「111010110101」があったとします。

これを8進数にすると、「 7265」となります。

だいぶスッキリして読みやすくなりました。

コンピュータは2進数しか扱えないため、どうしても桁が多くなります。そこで、人間にとって読みやすく翻訳してあげる必要があります。

その翻訳に使うのが、8進数や16進数と言うわけです。

2進数と8進数の基数変換

ここで、2進数から8進数に変換しましょう。

まず、考えられるのが10進数を経由するやり方だと思います。

先ほどの2進数「111010110101」を10進数にすると、、、

  1       1      1      0     1     0    1    1    0    1    0    1
  ×       ×       ×     ×     ×     ×    ×     ×    ×    ×    ×   ×
  211     210     29    28    27    26   25    24   23   22   21   20
  ||       ||       ||     ||     ||     ||    ||    ||     ||    ||   ||    ||
2048 + 1024 + 512 + 0 + 128 + 0 + 32 + 16 + 0 + 4 + 0 + 1 = 3765

と、なります。

そして、10進数「3765」を8進数にします。

3765 ÷ 8 = 470・・・5
 470 ÷ 8 =  58 ・・・6
  58 ÷ 8 =   7 ・・・2
   7 ÷ 8 =   0 ・・・7

= 7265

8進数「7265」が求まりました。

しかし、このやり方だと、桁数が多くなると計算がとても大変です。

そこで、8進数は2進数の3桁分ということを利用して、8進数から2進数へ直接、基数変換することができます。

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

例題として、先ほどの2進数「111010110101」、8進数「7265」を使っていきます。

8進数から2進数への変換手順は次の3つです。

      ①2進数を3桁ごとに区切る
      ②各区分のそれぞれの桁に20〜22をかける。
      ③各区分で求めた、合計値が8進数の各桁に相当する

それでは、手順通りに1つずつ見ていきましょう。

①2進数を3桁ごとに区切る

まず、2進数を3桁ごとに区切りましょう。
(3桁に区切るのは、8進数が2進数の3桁分に相当する為です)

1 1 1 | 0 1 0 | 1 1 0 | 1 0 1

4つの区分ができました。それぞれの区分が8進数の各桁に相当します。

②各区分のそれぞれの桁に20〜22を掛ける。

各区分の各桁に2nを掛けます。nは桁が上がるごとに1ずつ増やしていきます。

 1   1   1  |  0   1   0  |  1   1   0  |  1   0   1
 ×   ×   ×    ×   ×   ×    ×   ×   ×    ×   ×   ×
 22  21  20   22  21  20   22  21  20   22  21  20

③各区分で求めた、合計値が8進数の各桁に相当する

各区分ごとに求めた数値を足し合わせる。

 1   1   1  |  0   1   0  |  1   1   0  |  1   0   1
 ×   ×   ×    ×   ×   ×    ×   ×   ×    ×   ×   ×
 22  21  20   22  21  20   22  21  20   22  21  20
 ||   ||   ||   ||   ||   ||    ||   ||   ||   ||   ||   ||
  4 + 2 + 1  |  0 + 2 + 0   |  4 + 2 + 0   |  4 + 0 + 1
    ||           ||           ||           ||
    7           2           6           5

8進数「7265」が求まりました。

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

続いて8進数「7265」を2進数へ変換してみましょう。

8進数から2進数への基数変換の手順は、次の3つです。

      ①8進数の各桁を分割し、各桁ごとに2を割って計算する
      ②商と余を算出し、商が0になるまで繰り返す
      ③余りを算出の逆順(下から)に並べたら、8進数の各桁の2進数の出来上がり

①8進数の各桁を分割し、各桁ごとに2を割って計算する

7 2 6 5を分割。

 7  |  2  |  6  |  5

それぞれを2で割っていきます。

②商と余を算出し、商が0になるまで繰り返す

「7」を計算

7 ÷ 2 = 3(商) ・・・ 1(余)
3 ÷ 2 = 1(商) ・・・ 1(余)
1 ÷ 2 = 0(商) ・・・ 1(余)

「2」を計算

2 ÷ 2 = 1・・・ 0
1 ÷ 2 = 0・・・ 1

「6」を計算

6 ÷ 2 = 3 ・・・ 0
3 ÷ 2 = 1 ・・・ 1
1 ÷ 2 = 0 ・・・ 1

「5」を計算

5 ÷ 2 = 2 ・・・1
2 ÷ 2 = 1 ・・・ 0
1 ÷ 2 = 0 ・・・ 1

③余りを算出の逆順に並べたら、8進数の各桁の2進数の出来上がり

②で、「2」の計算時だけ、2進数が2桁となっています。そこで、0を補って3桁にしてあげましょう。
なぜなら、8進数は2進数の3桁分ですので、3桁にする必要があります。

「7」を計算
商 余
7 ÷ 2 = 3 ・・・ 1 ↑
3 ÷ 2 = 1 ・・・ 1 ↑
1 ÷ 2 = 0 ・・・ 1 ↑

=111

「2」を計算
2 ÷ 2 = 1 ・・・ 0 ↑
1 ÷ 2 = 0 ・・・ 1 ↑
              0 ↑ ←0を補う

= 010

「6」を計算
6 ÷ 2 = 3 ・・・ 0 ↑
3 ÷ 2 = 1 ・・・ 1 ↑
1 ÷ 2 = 0 ・・・ 1 ↑

= 110

「5」を計算
5 ÷ 2 = 2 ・・・ 1 ↑
2 ÷ 2 = 1 ・・・ 0 ↑
1 ÷ 2 = 0 ・・・ 1 ↑

= 101

 7   |  2   |  6   |  5
1 1 1 | 0 1 0 | 1 1 0 | 1 0 1

2進数「111 010 110 101」が求まりました。

こちらも、例題を通して3回ほど手を動かしてみましょう!

8進数は、2進数の3桁分であること(23で表現できる)。

まとめ

  • 基本情報技術者試験でよく聞かれるのは、n進数。特に2進数、8進数、10進数、16進数の理解と関係を理解することが重要
  • 8進数と10進数の基数変換は次の4通り
  •   

    整数部 小数部
    10進数から8進数 ①8で割り算  ②8で掛け算 
    8進数から10進数 ③8nで掛け算(nは桁が上がるごとに1ずつ増) ④1/8nで掛け算(nは桁が下がるごとに1ずつ増える)


  • コンピュータは2進数の世界で生きている。人間が読みやすいように翻訳してあげる必要がある。
  • 8進数と2進数の関係は、8進数は2進数の3桁分。
  • 基数変換は実際に紙とペンを用意して、手を動かして計算することで克服できる

この記事が参考になったら嬉しいです。

それでは、また次の記事でお会いしましょう!