16進数を知ろう! 2進数との関係が大事です。

16進数を知ろう!  2進数との関係が大事です。

悩み

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

結論

16進数は知っておいた方が良いです。
なぜなら、

  1. ITエンジニアとしてn進数の理解はとても重要だから。
  2. 基本情報技術者試験でよく聞かれるから。

 

信頼性

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

 

この記事を読むとできる様になること

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

ITエンジニアとして、n進数の理解は避けては通れないもの。そのため、基本情報技術者試験でもn進数はよく聞かれます。

特に試験上重要なのが、

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

の4つです。

今回は、16進数について解説しております。

合わせてこちらの記事もご覧ください。

なお、冒頭の「16進数の小数 0.248を10進数の分数にすると?」の答えは、「73/512」です。
解答手順は次の通りです。

①  0.248の小数点以下の各桁に1/16nを掛ける
(nは1からスタートし、桁が下がるごとに1つずつ増やしていく)

   2       4       8
   ×       ×       ×
 1/161   1/162   1/163

②  ①で求めた数値を合計する

   2       4       8
   ×       ×       ×
 1/161   1/162   1/163
   ||       ||       || 
 2/16    4/256   8/4096

= 512/4096 + 64/4096 + 8/4096
= 584/4096
= 73/512

n進数とは?

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

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

16進数の理解

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

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

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

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

A~Fが数字?と思った方もいるかと思います。

普段 10進数の世界で生きている我々の世界では、9の次は、桁上がりで表現された10を使います。

これは、10進数の世界では 0~9の10個のみの数字で表現されるからです。
つまり、9の次の数字以降を1字で表現する数字は存在しないと言えます。

一方、16進数の世界では、15番目の数字の次に桁上がりをして、10を表現します。

そのため、16進数の世界では、10進数における10〜15の数字を表現するために、A~Fを使っています。

16進数の世界で表現される数字は、0,1,3,4,5,6,7,8,9,A,B,C,D,E,Fの16個。
A~Fを数字としてとらえよう!

2進数・8進数・10進数・16進数の比較

ここで、2進数・8進数・10進数・16進数を比較してみましょう。

  

2進数 8進数 10進数 16進数
0
1
10(桁上がり)
11
100(桁上がり)
101
110
111
1000(桁上がり)
1001
1010
1011
1100
1101
1110
1111
10000(桁上がり)
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
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
10(桁上がり)

桁上がりのタイミングに注目してください。

桁上がりのタイミングを理解することがn進数の世界を理解することになります。

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

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

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

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

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

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

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

例えば、552.125の場合。
整数部は、552。小数部は、 0.125です。

2. 4つのパターンを押さえる

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

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

  

       整数部    小数部 
10進数から16進数   ①   ②
16進数から10進数   ③   ④

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

ここでは、例題として、10進数では、「110.453125」、16進数では、「6E.74」を使って行きます。
2つとも同じ数字を指しています。

① 10進数の整数部「110」を16進数「6E」に変換

1. 整数部を16で割ります。
 (16で割るのは、16進数だからです。)

  110 ÷ 16

2. 商と余を算出します。

  110 ÷ 16 = 6 (商)・・・14 (余)

3. 算出した商をさらに16で割って行きます。
 (この場合、6をさらに16で割ります。)

  110 ÷ 16 = 6・・・14
  6  ÷  16 = 0・・・6

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

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

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

  110 ÷ 16 = 6・・・14 ↑ ※10進数「14」は、16進数では、「E」と読み替える
  6  ÷  16 = 0・・・6 ↑

 = 6 E

 

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

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

 0.453125 × 16 = 7.25

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

 0.453125 × 16 = 7.25 ・・・ 整数部 → 7 : 小数部 → 0.25
 0.25  ×  16 = 4.0

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

 0.453125 × 16 = 7.25 ・・・ 整数部 → 7 (小数部0.25)
 0.25  ×  16 = 4.0 ・・・ 整数部 → 4
  (小数部が0となったので、ここで終了です。)

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

 0.453125 × 16 = 7.25 ・・・ 整数部 → 7 ↓
 0.25  ×  16  =  4 ・・・ 整数部 → 4 ↓

 = 0. 7 4

となります。

③ 16進数の整数部「6E」から10進数「110」に変換する。

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

  6     E(=14)
  ×     ×
 161   160

※Eは、10進数では「14」ですので、計算しやすいように14に直します。

2. ここで16nを変換してみましょう。

 160 = 1 (どんな数字に0乗を掛けても、「1」となると覚えておきましょう)
 161 = 16

となります。

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

   6    E(=14)
   ×    ×
  161  160
   ||    ||
  96 + 14 = 110

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

1. 小数部「74」の各桁に1/16nを掛けます。
  nは、1からスタートし、各桁が下がるごとに1ずつ増やして行きます。

 0.  7      4
     ×      ×
   1/161   1/162

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

 1/161 = 1/16 = 1 ÷ 16 = 0.0625
 1/162 = 1/256 = 1 ÷ 256 = 0.00390625

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

  0 .  7         4
       ×         ×
    0.0625    0.00390625
    (1/161)     (1/162)
       ||         ||
    0.4375  +  0.015625  =  0.453125

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

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

  

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

例題

10進数「110.453125」
16進数 「6E.74」

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

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

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

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

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

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

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

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

なぜなら、16は24で表現できるから。
これは、2進数の「0000〜1111」が、16進数の「0〜F」に対応しています。
つまり、16進数の1桁は、2進数の4桁分ということです。

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

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

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

  1    1    1    1
  ×    ×    ×    ×
  23   22   21   20
  ||    ||    ||    ||
  8 +  4 +  2 +  1  =  15

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

そして、10進数の15は、16進数では「F」ですね。

2進数と16進数の関係がわかりました。
では、なぜ24で表現するのでしょうか?

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

例えば、
2進数「111010110101」があったとします。
これを16進数にすると、「 EB5」となります。

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

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

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

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

2進数から16進数、16進数から2進数へ変換していきましょう。

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

ここで、2進数から16進数に変換しましょう。
まず、考えられるのが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」を16進数にします。

 3765 ÷ 16 = 235 ・・・ 5   ↑
 235  ÷ 15 = 14 ・・・11(B)  ↑
 14  ÷  16  = 0 ・・・14(E)  ↑

 = EB5

16進数「EB5」が求まりました。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

   1   1   1   0   |  1   0   1   1   |   0   1   0   1
   ×   ×   ×   ×      ×   ×   ×   ×      ×   ×   ×   ×
   23  22  21  20     23  22  21  20     23  22  21  20
   ||   ||   ||   ||      ||   ||   ||   ||      ||   ||   ||   ||
   8 + 4 + 2 + 0     8 + 0 + 2 + 1      0 + 4 + 0 + 1
         ||                   ||                  ||
        14(E)               11(B)                5

16進数「EB5」が求まりました。

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

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

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

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

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

EB5を分割。

 E | B | 5

それぞれを2で割っていきます。
なお、計算の為「E」は14、「B」は11の10進数に読み替えます。

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

「E(14)」を計算

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

「B(11)」を計算

 11 ÷ 2 = 5(商)・・・ 1(余)
  5 ÷ 2 = 2 ・・・ 1
  2 ÷ 2 = 1 ・・・ 0
  1 ÷ 2 = 0 ・・・ 1

「5」を計算

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

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

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

「E(14)」を計算

 14 ÷ 2 = 7 ・・・ 0 ↑
  7 ÷ 2 = 3 ・・・ 1 ↑
  3 ÷ 2 = 1 ・・・ 1 ↑
  1 ÷ 2 = 0 ・・・ 1 ↑

 = 1110

「B(11)」を計算

 11 ÷ 2 = 5 ・・・ 1 ↑
  5 ÷ 2 = 2 ・・・ 1 ↑
  2 ÷ 2 = 1 ・・・ 0 ↑
  1 ÷ 2 = 0 ・・・ 1 ↑

 = 1011

「5」を計算

  5 ÷ 2 = 2 ・・・ 1 ↑
  2 ÷ 2 = 1 ・・・ 0 ↑
  1 ÷ 2 = 0 ・・・ 1 ↑
                    0 ↑ ←0を補う

 = 0101

   E    |   B    |   5
 1110  |  1011  |  0101

2進数「1110 1011 0101」が求まりました。

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

 

16進数は、2進数の4桁分であること(24で表現できる)。

まとめ

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

  

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

・16進数と2進数の関係は、16進数は2進数の4桁分。
・基数変換は実際に紙とペンを用意して、手を動かして計算することで克服できる

この記事が参考になったら嬉しいです。
それでは、また次の記事でお会いしましょう!