16進数(十六進法)は、基数が16の数値表記体系です。英語では「hexadecimal(ヘキサデシマル)」、略してhex(ヘックス)と呼ばれることが多く、日本語でも「16進法」「16進数」「ヘックス」と表記されます。通常は16種類の記号を使い、0~9の数字に加えて、10~15を表すために アルファベットの A、B、C、D、E、F を用います。これは、16の記号(ベース16)で構成された数字体系であるためです。

なぜコンピュータで使うのか

人間は普段、10進数を使います(指が10本あることが一因とされます)。一方、コンピュータは内部で0と1の2種類の状態(2進数)だけを扱います。長い2進数の列を人間が直接読むのは大変なので、エンジニアはビットをまとまり(グループ)で扱います。現代のコンピュータでは4ビットの塊を1つの単位として扱うことが多く、4ビットで表せる16通りの値と対応させるのに便利なのが16進数です。コンピュータの専門用語で、4ビットは1 ニブル(nybble)と呼ばれ、ニブル1つが16進数の1桁に相当します。ニブル2つで1 バイト(8ビット)になります。

16進数の桁と値の対応

16進数の1桁は次のように対応します。

  • 0 = 0
  • 1 = 1
  • 2 = 2
  • 3 = 3
  • 4 = 4
  • 5 = 5
  • 6 = 6
  • 7 = 7
  • 8 = 8
  • 9 = 9
  • A = 10
  • B = 11
  • C = 12
  • D = 13
  • E = 14
  • F = 15

16進数の各桁は位置によって 16 のべき乗(16^0, 16^1, 16^2, ...)を係数として重みづけされます。たとえば 0x1A3 (あるいは 1A3h)は次のように10進数に変換できます:

1×16^2 + A(=10)×16^1 + 3×16^0 = 1×256 + 10×16 + 3 = 256 + 160 + 3 = 419

16進数と2進数の関係(ビットとの対応)

各16進桁は4ビット(ニブル)に対応するため、2進数と16進数の相互変換が簡単になります。いくつかの例を示します:

  • 0 = 0000
  • 1 = 0001
  • 2 = 0010
  • 3 = 0011
  • 4 = 0100
  • 5 = 0101
  • 6 = 0110
  • 7 = 0111
  • 8 = 1000
  • 9 = 1001
  • A = 1010
  • B = 1011
  • C = 1100
  • D = 1101
  • E = 1110
  • F = 1111

16進数 ⇔ 10進数 の変換方法

16進数 → 10進数(例:0x63)

各桁にその位置の16のべき乗を掛けて足し合わせます。0x63 は 6×16^1 + 3×16^0 = 6×16 + 3 = 96 + 3 = 99(10進数)です。よって、63h と 0x63 は16進数の63(10進数では99)を意味します。

10進数 → 16進数(例:10進数255 を16進数に変換)

  1. 255 ÷ 16 = 15 余り 15 → 余り15はF。
  2. 15 ÷ 16 = 0 余り 15 → これもF(上位桁)。
  3. よって 255(10進) = 0xFF(16進)。

表記法の違いと注意点

  • 一般的な表記:先頭に「0x」を付ける(例:0x1A3)。多くのプログラミング言語で標準的です。
  • アセンブリ言語などでは末尾に「h」を付けることがある(例:1A3h)。ただし、先頭が数字で始まる場合は混同を避けるために先頭に0を付けたりする慣習があります(例:0FFh)。
  • 大文字・小文字は区別されないことが多く、0x1a3 と 0x1A3 は同じ値です。
  • 一部の言語や環境では別の表記(例えば先頭に「$」を付ける)を使うこともあります。使う環境の規則を確認してください。

応用上のポイント

  • メモリアドレスや色コード(CSSの #RRGGBB)、ビットマスクの表示などで16進数がよく使われます。
  • 符号付き整数を16進で表すときは、通常は内部表現(たとえば2の補数)をそのまま16進で表示します。たとえば8ビットの-1は内部的に11111111(二進)=0xFF(16進)です。
  • 小数部分(負数や小数)も16進で表すことは可能ですが、慣用的にはあまり使われません(浮動小数点の内部表現は別途規格に従います)。

まとめると、16進数はコンピュータの2進データを人間が読みやすく表現するために便利な表記法であり、4ビットごとに1桁で対応させられるため、2進数との変換が簡単です。表記には「0x」や「h」などの慣習があるので、文脈に応じて使い分けましょう。