2進数と10進数と16進数 ~ 相互比較と進数変換 ~

ジタルとアナログ編の デジタルデータと2進数 で解説のとおり、コンピュータが理解できるのは0と1の2進数のみです。

したがって、すべてのデータは2進数に置き換えられて処理されており、2進数について学習しておくことは理解を深める上でも重要になっていきます。

本項では、その2進数と私たちが普段扱っている10進数、膨大な桁数になる2進数をある程度簡略化して、プログラミング等に利用される16進数について、それらの比較と相互変換について解説したいと思います。

なぜ16進数が利用されるのかというと、2進数では扱う桁数が膨大なものになるという理由と、16進数は2の乗数(2の4乗)であるため、コンピュータが処理し易いためです。

まず、それぞれを比較した対応表をみてみましょう。

2進数と10進数と16進数の対応表
2進数 10進数 16進数 2進数 10進数 16進数
0 0 0 10001 17 11
1 1 1 10010 18 12
10 2 2 10011 19 13
11 3 3 10100 20 14
100 4 4 10101 21 15
101 5 5 10110 22 16
110 6 6 10111 23 17
111 7 7 11000 24 18
1000 8 8 11001 25 19
1001 9 9 11010 26 1A
1010 10 A 11011 27 1B
1011 11 B 11100 28 1C
1100 12 C 11101 29 1D
1101 13 D 11110 30 1E
1110 14 E 11111 31 1F
1111 15 F 100000 32 20
10000 16 10 100001 33 21

それぞれの数の特徴は次のようになります。

10進数

0~9の10個の数を使い、繰り上がりは、10のべき乗になります。1は100、10は101、100は102、1000は103・・・という具合です。

例えば、「56513」という数字を10進数の式になおすと、

104×5+103×6+102×5+101×1+100×3

となり、「(10000×5)+(1000×6)+(100×5)+(10×1)+(1×3)=56513」となります。10進数は私たちが普段使っている数字ですが、コンピュータ処理には向いていません。

2進数

0と1の2個の数を使い、繰り上がりは、2のべき乗になります。1は20、10(10進数では2)は21、100(10進数では4)は22、1000(10進数では8)は23・・・という具合です。

例えば、「11010」という数字を2進数の式になおすと、

24×1+23×1+22×0+21×1+20×0

となり、「(10000×1)+(1000×1)+(100×0)+(10×1)+(1×0)=11010」となります。ちなみに10進数に変換すると、「(16×1)+(8×1)+(4×0)+(2×1)+(1×0)=26」となります。逆に10進数から2進数の変換方法については後述します。

16進数

0~9の10個の数とアルファベットのA~Fの6個の文字を使い、計16個の英数字を使います。繰り上がりは、16のべき乗になります。1は160、10(10進数では16)は161、100(10進数では256)は162、1000(10進数では4096)は163・・・という具合です。

例えば、「CA125」という数字を16進数の式になおすと、

164×C+163×A+162×1+161×2+160×5

となり、「(10000×C)+(1000×A)+(100×1)+(10×2)+(1×5)=CA125」となります。ちなみに10進数に変換すると「(65536×12)+(4096×10)+(256×1)+(16×2)+(1×5)=827685」となります。逆に10進数から16進数への変換方法については後述します。

16進数はアルファベットが用いられるため、慣れないと扱いづらい部分がありますが、2進数よりはるかに扱い易いはずです。2進数を16進数に変換するには、2進数の下位から4ビットずつ区切って、その4ビットを16進数で表します。

具体的な方法については、2進数、10進数、16進数の相互変換を実際にやりながら学習していきましょう。まずは、2進数と10進数の相互変換です。

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

先ほどの例と同様に、2進数を2進数の式になおして計算すれば算出することができます。例えば「1101101」を10進数に変換してみます。

2進数の下位から、20、21、22・・・を1もしくは0と掛けて、

(26×1)+(25×1)+(24×0)+(23×1)+(22×1)+(21×0)+(20×1)

を計算します。したがって「64+32+8+4+1=109」となります。つまり、2進数「1101101」は10進数「109」で表すことができます。

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

では逆に、10進数「109」を2進数に変換してみましょう。「109」から上の式がすぐに算出できたら問題なく答えは出ますが、4桁以上の10進数を扱うようになるとかなり困難になってきます。

実は簡単な方法があるのです。それは、10進数を「2」で割り、その商が1になるまで割って行きます。その余りを最後から順番に並べると、2進数に変換することができます。

10進数から2進数への変換イメージ

この方法であれば、何桁の10進数であっても簡単に2進数へ変換することができます。

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

2進数を16進数で表すには、先述のとおり、2進数の下位から4ビットずつ区切って、その4ビットを16進数で表します。つまり、2進数を4ビット束ねると、「0000~1111」で24=16通りの並び方があるために16進数が用いられるわけです。

そして、束ねた4ビットを10進数に変換して、さらにそれを16進数に変換します。先ほどの例と同様に「1101101」を16進数に変換してみましょう。

まず、下位から4ビットに区切って、(0110)と(1101)に分けます。上位の「110」が3ビットになりますが、先頭に0を付けて「0110」の4ビットにします。

(23×0)+(22×1)+(21×1)+(20×0)=6
(23×1)+(22×1)+(21×0)+(20×1)=13

となり、10進数の6と13は、16進数ではそれぞれ「6」と「D」となります。つまり、2進数「1101101」は16進数「6D」で表すことができます。

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

では逆に、16進数「6D」を2進数に変換してみましょう。工程を逆にするだけなので、まず16進数を10進数に変換し、10進数から2進数に変換します。

したがって、16進数の6とDは、10進数ではそれぞれ「6」「13」となり、それらをそれぞれ2進数に変換して、「0110」と「1101」となります。最後にそれらを結合して先頭の0を省略して「1101101」となります。

もう一例として、「CA125」を2進数に変換すると、まず10進数で「12・10・1・2・5」となり、2進数では「1100・1010・0001・0010・0101」で、「11001010000100100101」に変換することができます。

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

10進数から2進数への変換と同様に、10進数を「16」で割り、その商が15以下になるまで割って行きます。その余りを最後から順番に並べると、16進数に変換することができます。

例として「827685」を16進数に変換してみましょう。

10進数から16進数への変換イメージ

この方法であれば、何桁の16進数であっても簡単に10進数へ変換することができます。

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

先述した例と同様に16進数を16進数の式になおして計算すれば算出することができます。例えば「CA125」を10進数に変換してみます。

16進数の下位から、160、161、162・・・を掛けて、

(164×C)+(163×A)+(162×1)+(161×2)+(160×5)

を計算します。したがって「(65536×12)+(4096×10)+(256×1)+(16×2)+(1×5)=827685」となります。

これらがそれぞれの一般的な変換方法になります。この他にも様々な計算方法があるようですが、そのあたりの詳しい解説は割愛します。

こうした知識は、プログラミングや情報処理試験を目指す方には必須の知識になります。

更新履歴

2009年9月7日
ページを公開。
2009年9月7日
ページをXHTML1.0とCSS2.1で、Web標準化。レイアウト変更。
2014年5月23日
内容修正。
2018年2月3日
ページをSSL化によりHTTPSに対応。

参考文献・ウェブサイト

当ページの作成にあたり、以下の文献およびウェブサイトを参考にさせていただきました。

2進数と16進数
http://tfusvsun.tfu.ac.jp/mko/CASL2/vol1/right.html
16進数変換・文字コード
http://homepage1.nifty.com/mstak/Computer/JavaScript/program-form2.html