現在の情報化社会を支える大事な要素といえばコンピュータですが、そのコンピュータは人間とは数の数え方が違います。

コンピュータについてそれなりに知識のある人なら、0と1の2種類しか使わない2進数を扱っていることはご存じでしょう。

しかしコンピュータの世界では2進数の他に、16進数という数え方もよく出てきます。





2進数だけでも意味不明なのに16進数も出てきて、結構複雑です。

16進数と10進数、互いにどういった方法で変換されるのかが気になりますね。

またそもそもなぜ16進数まで使う必要があるのか?それぞれ詳しく見ていきましょう!


スポンサーリンク

16進数とは?

16進数(または十六進法ともいう)とは、0、1、2、3、4、5、6、7、8、9の10個の数字と、A、B、C、D、E、Fの6つのアルファベットを用いた記数法のことです。

難しい言い方をすると、16を底とする位取り記数法となりますが、単純に各桁が16になると桁上がりする数字と考えてもOKです。


しかし16ごとに桁上がりするということは、10進数にあたる10~15までの6つの数字も1桁で表わさないといけません。

そこで出てくるのが先ほど紹介した、A~Fの6つのアルファベットです。

この6つのアルファベットを、以下のように10~15の数字に対応させることで、0~15までの数字を全て1桁で表現できます。

  • 0→0
  • 1→1


  • 9→9
  • 10→A
  • 11→B
  • 12→C
  • 13→D
  • 14→E
  • 15→F
  • 16→10

15(F)まで進んだら、桁が1つ上がるので、“10”となります。すなわち16進数で表記された“10”は、10進数でいうところの“16”です。

3桁目の“100”になるには、“FF”を1つ上げた時です。


“FF”は10進数でいうと、“255”に相当します。

255は「16²-1」なので、16²=256→100となります。

16,256,・・・と「16のn乗」ごとに、桁が1つずつ増えていることがわかりますね。


これは10進数と同じ考えです。10進数では10,100,1000,10000・・・と「10のn乗」の時に桁が1つずつ増えます。

1桁左に書かれた数字は、その右の数字よりも16倍の重みがあるということです。


ここまでが16進数の基礎となります。

次からは、16進数で表記された数字を10進数に、10進数で表記された数字を16進数に変換するための方法を具体的に解説していきます。


スポンサーリンク

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

まずは比較的簡単な16進数から10進数への変換からです。

実はこの変換のやり方については、以前投稿した2進数と10進数についての記事で紹介しているやり方とほぼ同じです。
2進数と10進数の変換!2の累乗数も覚えておけば楽になる?


では具体例を使って解説していきます。

1005CF」と表記された16進数の数字があります。(因みに16進数の数字は、先頭に0xを目印として付けます。)

この数字を10進数に変えるには、2進数の変換と同様で、各桁の数字に重みを掛けて、全て足し合わせます。


2進数の重みは「2の(n-1)乗」でしたが、16進数では「16の(n-1)乗」となります。

以上を踏まえた上で「0x1005CF」については

  1. 6桁目の数字は1なので、1×16⁵=1048576
  2. 5桁目の数字は1なので、0×16⁴=0
  3. 4桁目の数字は0なので、0×16³=0
  4. 3桁目の数字は1なので、5×16²=1280
  5. 2桁目の数字は0なので、C×16¹=192(Cは12)
  6. 1桁目の数字は1なので、F×16⁰=15(Fは15)

となるので、全て足し合わせれば

1048576+0+0+1280+192+15=

1050063

となります。


これで16進数から10進数への変換は完了です。

2進数と違って、16の累乗やアルファベットも出てくるので少しややこしいですね。


スポンサーリンク

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

次は逆のパターンとなる10進数から16進数への変換です。

こちらは少しややこしくなります。

基本となるのは2進数の時に紹介したやり方と全く一緒で、要は10進数の数字を商が0になるまで16で割り続ければよい、ということになります。


今回もわかりやすいように、先ほどの例で用いた「1050063」で解説します。

この「1050063」が逆変換で、16進数の「0x1005CF」と一致することを確かめましょう!

詳しい説明は省いて、まずは以下のように商が0になるまで16で割り続けます。

  1. 1050063を16で割って、商が65628、余りが15(=F)
  2. 65628を16で割って、商が4101、余りが12(=C)
  3. 4101を16で割って、商が256、余りが5
  4. 256を16で割って、商が16、余りが0
  5. 16を16で割って、商が1、余りが0
  6. 1を16で割って、商が0、余りが1

余りの数字を下から順番に並べると、「1005CF」となります。

※ただし余りが2桁の数字になっている部分は、さらに1桁に直す必要があります。上の例では、12と15をそれぞれCとFに変換させましょう。

16の累乗数を使って簡単に変換!

上で紹介したのはあくまで基本的な方法でした。

このやり方も実は16の累乗数をある程度覚えることで、比較的簡単に変換できます。


先ほどと同じ「1050063」で解説しますと、16進数から10進数に変換した時に以下のような形になりましたね。

1050063=1048576+0+0+1280+192+15

=1×16⁵+0×16⁴+0×16³+5×16²+12×16¹+15

やはり16の累乗数の和で表現出来てますね。

6番目の桁数は1、5と4番目の桁数は0、3番目の桁数は5、2番目の桁数はA、1番目の桁数はFで確定します。


以上から

1050063⇒⇒1 0 0 5 12 15⇒1005CF

と変換できることになります。


では今度は「5003」という数字を16進数に変換してみましょう!

16の累乗数を使って表現すると、


5003 =4096+907
=4096+3×256+139
=4096+3×256+8×16+11
=1×16³+3×16²+8×16¹+11×16⁰

各桁ごとに数字を割り振れば「5003」は

5003⇒0x138B

となりますね。

16の累乗数についてはできれば“16の5乗=1048576”まで、覚えておいた方が効率的です。

  • 16¹= 16= 0x10(16進数)
  • 16²= 256= 0x100(16進数)
  • 16³= 4096= 0x1000(16進数)
  • 16⁴= 65536= 0x10000(16進数)
  • 16⁵= 1048576= 0x100000(16進数)

だいたい上の5つを暗記しておけば、10進数の数字を16進数に変換する際に役に立ちます。

特に16の4乗=65536は、2の32乗と同じでこれは頻出です。

6乗以上となるとかなり巨大な数字になるので、余力がある方だけ覚えてください(;^^)


小数点以下はどう表記する?

これまでは整数のみの変換を扱ってきました。しかし整数だけでなく、時には小数も扱わなければいけない場面は出てきますね。

10進数で小数点以下の数字を16進数に変換するにはどうすればよいでしょうか?

難しい話となるので敢えて簡単に解説しますが、やり方としては「小数部が0になるまで16倍し、答えの整数部分を上から並べる」と覚えましょう!

整数の10進数を16進数に変換した時は16で割りましたが、小数点以下の時は掛け算になるのです。

例えば、「0.84375」という数字を16進数に変換するには

  • 0.84375×16=13.5(13=D)
  • 0.5×16=8.0

つまり

0.78125⇒「0.D8

※実際変換してみてわかるのですが、16進数の時は16倍となるので小数点以下が0になるパターンは下1桁が5の時だけです。それ以外の奇数や偶数時では、いくら掛けても少数点以下が0にならないので、ほぼ無限小数になります。



では次は逆のパターンで見てみましょう。

「0.D8」と表記された16進数を10進数に変換するには、単純に小数点以下の「D8」の部分を10進数に変換するだけです。


ただしここで注意すべきは小数点以下の桁数です。

上の例では小数点以下が2桁だけですね。

この場合は最上位の桁の重みは「16の2乗」となり、2桁目の重みは「16の1乗」となります。

すなわち

D8⇒13×16²+8×16¹=216

となります。


ただしここで答えとなった小数点以下の216という数字は、0.84375と一致していないですね。

ではやり方が間違っているのかと言いますとそうではなくて、実はさらに216という数字を256で割ることが必要になります。

16進数「0.D8」の小数点以下の数字の意味とは、「256(16の2乗)分の量がD8(=216)ある」ということと同義です。


すなわち

216/256=108/128=54/64=27/32=0.84375

となるので、10進数と一致します。


ぶっちゃけここの部分は凄くややこしいですね。16進数のみならず、2進数でも小数点以下の変換はかなり戸惑うと思います。

相当数問題などをこなして慣れるしかないですね(;-_-)

16進数を使う場面とは?

16進数は2進数に比べるとややマイナーかもしれませんが、情報学においてはよく出てくる用語です。

代表的なのがhtmlのカラーコードですね。赤色なら#ff0000、青色なら#0000ffとして表現されます。

簡単に言いますと、htmlのカラーコードはRGB値と呼ばれ、最初の2桁が赤、真ん中の2桁が緑、最後の2桁が青の6桁になっています。

それぞれが16進数で設定されているので、「16⁶-1」通りの色が理論上表現できる形です。

他にもパソコンならIPアドレスの表記にも用いられますね。

さらにデータをオクテット形式(二進表記の8桁)で表現する際には、16進数で表すのが一般的で、利便性を高める意味でも16進数は重要となってきます。

まとめ

今回は16進数についての解説でした。やや難解な感じになったかもしれませんが、参考になりましたら幸いです。

16進数は2進数に比べるとアルファベットのA~Fまで出てくるので、慣れない内はややこしく感じます。

ただコンピュータの世界でAやFと一緒に数字が表記されていたら、十中八九16進数が関係している数字だとわかってきます。


特にゲームプログラミングでは数値のオーバーフロー関係でよくお世話になります。

ある程度プログラミングをかじった人なら、乱数や番地として255や65535なんていう数字が出てきますが、いずれも2のn乗や16のn乗、さらに8のn乗も関係してきます。

2進数と16進数はプログラミングをマスターしたい方にとっては必要不可欠でしょう。

変換も駆使すれば自分自身の計算能力も高まるので、頭の体操としても最適ですよ!


スポンサーリンク



こちらの記事もどうぞ!

デスクトップパソコンのメリットとは?ノートPCにはない魅力って?