2進数、8進数、10進数、16進数、ついでに60進数のお話
今回は、タイトルにある通り、2進数、8進数、10進数、16進数についてお話したいと思います。
60進数については、あくまでオマケです。
数を表現する方法は、実はたくさんあります。
我々が現在、一般的に使用しているのは、10進法で表された10進数です。
その10進数の数字は、アラビア数字(算用数字)、ローマ数字、漢数字などで表現されていますね。
でも今回は、数字の表し方ではなく、数の表し方のお話です。
(数字と数は、意味が違うのですが、また別の機会にお話できればと思います。)
数の表し方は、実は他にもたくさんあり、特にコンピュータの世界では、10進数とは違う方法で扱われています。
それでは、10進数とは違う表現方法について、お話していきたいと思います。
n進数(n進法)の考え方
数を表現する方法として、「n進法」という考え方があります。
・n個の数字で、数を表現する
・n個で表現できなくなったら、桁上がりする
・各桁に「重み」が割り当てられている
簡単にルールを説明するとこんな感じです。
各桁(位:くらい)に重みが割り当てられていることから、「位取り記数法」とも呼ばれています。
実際にどのように表現するのかは、次項から説明していきたいと思います。
10進数について
幼稚園、小学校で習う数の数え方が、10進法です。
10進法で表現された数が、10進数になります。
10進数は、0〜9までの10個の数字で表し、9の次の数は、桁上がりして、10と表現されます。
この場合、
1000 × 1 + 100 × 2 + 10 × 4 + 1 × 7 = 1247
となります。
この考え方が全てのn進数に当てはまります。
2進数について
2進数は、2つの数字のみで表す数ということになります。
10進数で説明した、1247という数を2進数で表してみます。
1024 + 128 + 64 + 16 + 8 + 4 + 2 + 1 = 1247
2進数で表すと、1247 = 10011011111 となり、
11桁にもなってしまいました。
私たちが日常で使うには、とても不便ですね。
この記数法は、主にコンピュータの内部で扱われます。
電気信号がオンの時に、1
オフの時に、0
という風に扱うことで、電気信号を数に置き換えることが可能となります。
8進数について
8進数もコンピュータの世界で主に扱われる記数法です。
0〜7までの8個の数字で表す数え方になります。
2進数と同様に、10進数の1247を8進数で表してみましょう。
512 × 2 + 64 × 3 + 8 × 3 + 1 × 7 = 1247
8進数では、1247 = 2337 となり、
2進数と比べると、だいぶ10進数に近くなりましたね。
それでも、10進数で生活している私たちには、扱いづらい表現方法ですよね?
これは、2進数との相性が良く、8進数は、2の3乗進数と考えることができます。
後ほど相性が良い理由もお話していきます。
16進数について
16進数も8進数と同様、コンピュータの世界で頻繁に扱われる記数法です。
16個の数字で表し、16になったら桁上がりする仕組みです。
ここで問題になるのが、16個の数字ってどうやって扱うの?
数字って、0〜9の10個しかありませんよね?
16進数では、0〜9の他に、A、B、C、D、E、F というアルファベットを数字として扱います。
それぞれのアルファベットは、
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15
として扱うことと定義しています。
それでは、これまでと同様に、10進数の1247を16進数で表してみましょう。
256 × 4 + 16 × 13 + 1 × 15 = 1247
16進数では、1247 = 4DF となります。
10進数よりも桁数が少なくなりました。
これも8進数と同じで、2進数と相性が良いのです。
その理由も次項でお話したいと思います。
それぞれの変換方法
10進数、2進数、8進数、16進数について、それぞれ説明致しました。
ここでは、それぞれの記数法同士で変換する方法をご紹介していきます。
この変換方法は、中学受験の問題やコンピュータの試験などでも出題されるものになっています。
もしかしたら、どこかで役に立つかもしれません。
せっかくなので、この機会に覚えておくと良いと思います。
10進数を分解してみる
10進数の場合、1の位が何個、10の位が何個、というように各桁(重み)の箱にどれだけ入っているか?
で表すことができました。
例えば、先ほどの「1247」という10進数の場合、
10 )1247
10 ) 124・・・7
10 ) 12・・・4
1・・・2
10で順番に割り算していきます。
1247 ÷ 10 = 124 余り 7 となります。
次に、上記の商を10で割ります。
124 ÷ 10 = 12 余り 4
これを繰り返して、割れなくなるまで繰り返します。
最後に余りを下から順に並べていくと、1247となります。
10進数を2進数に変換
上記の分解方法を使うと、10進数を2進数に変換することができます。
2 )1247
2 ) 623・・・1
2 ) 311・・・1
2 ) 155・・・1
2 ) 77・・・1
2 ) 38・・・1
2 ) 19・・・0
2 ) 9・・・1
2 ) 4・・・1
2 ) 2・・・0
1・・・0
10進数の1247を2で割り続けると、上記のようになります。
最後に余りを下から順に並べていくと、10011011111となります。
10進数を8進数に変換
2進数の場合は、2で割り続けましたが、8進数の場合はどうなるでしょうか?
同じように、8で割り続けていきます。
8 )1247
8 ) 155・・・7
8 ) 19・・・3
2・・・3
これを余りを下から順に並べると、2337となります。
10進数を16進数に変換
10進数から16進数に変換する場合も繰り返しになりますが、10進数の1247を16で割り続けていきます。
16 )1247
16 ) 77・・・15
4・・・13
この余りを順番に並べると、41315とはなりません。
13は、D
15は、F にそれぞれ変換して並べます。
すると、4DF と表すことができます。
2進数を8進数に変換
先ほど、2進数と8進数は、相性が良いとお話しました。
その理由ですが、8 は、2 × 2 × 2 と表すことができますね?
つまり、8 = 2の3乗 ということになります。
もう少し、分解してお話すると、
8進数は、0 〜 7 の8個の数字を使うのですが、それを2進数で表現すると、
0 〜 111 の数字で扱うことができる、ということになります。
1の位が、0 〜 111
8の位が、0 〜 111
64の位が、0 〜 111
で、それぞれ表現されるということです。
それでは、10進数 1247 の2進数、10011011111 を8進数に変換してみます。
まず、この2進数を3桁ずつ分けます。
10 011 011 111
この3桁ずつに分けたそれぞれを10進数に変換していきます。
なぜ10進数にするかというと、先ほど説明した、8個の数字は、0〜7でした。
これを0〜111として表現していたので、元に戻してあげる作業になります。
すると、
10 は、2進数で、2
011 は、2進数で、3
111 は、2進数で、7
となりますので、結果は、2337 となります。
逆に、8進数 2337 を2進数に変換する場合は、それぞれの数字を10進数の数字として2進数に変換していきます。
2進数を16進数に変換
16進数は、2の4乗進数とも言い換えることができますね。
8進数と同様に、0 〜 15 の数字は、2進数で、0 〜 1111 と表すことができます。
それでは、2進数 10011011111 を16進数に変換してみます。
まずは、4桁ずつに分けます。
100 1101 1111
これを10進数に戻してあげます。
100 は、4
1101 は、13 = D
1111 は、15 = F
となりますので、結果は、4DF となります。
逆に、16進数 4DF を2進数に変換する場合は、それぞれの数字を10進数の数字として2進数に変換していきます。
8進数を16進数に変換
最後に、8進数を16進数に変換する方法です。
8進数 2337 を16進数に変換する場合を考えてみます。
それぞれの数字を一度、3桁ずつの2進数に変換します。
2 は、010
3 は、011
3 は、011
7 は、111
これを並べると、010011011111 となりますね。
今度は、この2進数の結果を4桁ずつに分けます。
0100 1101 1111
あとは、2進数から16進数に変換する手順と同じです。
結果は、4DF となります。
逆に16進数から8進数への変換もまずは4桁ずつの2進数に変換した後で、3桁ずつに分けて変換してあげます。
オマケ:60進数について
実は、60進数という記数法は、小学生で既に勉強しており、日常でも使っています。
00〜59で1桁を表し、60になったら桁上がりをする数…
そう、時間です。
時間の数え方は、60進法で表されていたんですね。
59分から60分になったら、桁上がりして、1時間となります。
でも、24時間になったら、桁上がりして、1日となります。
つまり厳密に言うと、「分」が60進数で、「時」は24進数ですね。