#03 バイナリデータ入門

16進数——バイナリを人間が読みやすくする表記

2進数の読みにくさ問題

前回学んだように、コンピュータの中はすべて0と1の2進数で動いています。しかし、2進数は人間にとって非常に読みにくいという問題があります。

たとえば、この数字を見てください。

11001010 10110111 00111001 11110000

これが何の値なのか、パッと見てもわかりませんよね。

そこで登場するのが 16進数(hexadecimal) です。16進数を使うと、同じ情報をずっとコンパクトに、人間が読みやすい形で書けます。

2進数:11001010 10110111 00111001 11110000
16進数:  CA      B7      39      F0

たった8文字になりました。


16進数とは

10進数は0〜9の10種類の数字を使います。2進数は0と1の2種類です。

16進数は0〜15の16種類の値を、1桁で表します。

0〜9はそのまま数字を使いますが、10〜15には アルファベットのA〜F を使います。

10進数16進数2進数
000000
110001
220010
330011
440100
550101
660110
770111
881000
991001
10A1010
11B1011
12C1100
13D1101
14E1110
15F1111

A〜Fは大文字でも小文字(a〜f)でも使われます。どちらでも同じ意味です。


なぜ16進数が便利なのか——ニブルの話

ここが16進数の最大の魅力です。

16進数の1桁 = 2進数の4桁(4ビット) がぴったり対応します。

4ビットは「ニブル(nibble)」と呼ばれ、16種類(0000〜1111)の値を表せます。16進数の1桁もちょうど16種類です。偶然ではありません——これは 2⁴ = 16 という数学的な関係から来ています。

16進数 1桁 ←→ 2進数 4桁(ニブル)

  C       A
  ↓       ↓
 1100   1010

つまり CA = 11001010

1バイト = 16進数2桁

1バイト = 8ビット = 4ビット × 2

なので、1バイトはちょうど 16進数2桁 で表せます。

1バイト(8ビット)の範囲:
  最小:00000000 = 0x00 = 0
  最大:11111111 = 0xFF = 255

0xFF0x は「これは16進数ですよ」という目印(プレフィックス)です。プログラムや技術文書でよく使われます。


2進数 ↔ 16進数の変換

変換はとても簡単です。4ビットずつのグループに区切るだけです。

2進数 → 16進数

2進数:1111 0011

左のグループ → 1111 = F
右のグループ → 0011 = 3

16進数:F3(= 0xF3)

16進数 → 2進数

16進数:2B

2 → 0010
B → 1011

2進数:0010 1011

16進数 → 10進数

10進数と同じく「桁の位取り」で計算します。16進数は16倍ずつ増えます。

0xF3 の場合:

F × 16¹ + 3 × 16⁰
= 15 × 16 + 3 × 1
= 240 + 3
= 243

よく使われる16進数の値一覧

16進数10進数意味のある場面
0x000NUL文字、アドレスの最小値
0x0A10改行文字(LF)
0x2032スペース文字
0x4165英字「A」(ASCII)
0x6197英字「a」(ASCII)
0x7F127ASCII最大値
0xFF2551バイト最大値
0x1002561バイトを超えた最小値

実際の使い場面

Webの色コード(CSSカラーコード)

Webデザインで使う #FF5733 のような色コードは、16進数3バイト で書かれています。

#FF5733

FF → 赤(R) = 255
57 → 緑(G) = 87
33 → 青(B) = 51
#000000 → 黒(R=0, G=0, B=0)
#FFFFFF → 白(R=255, G=255, B=255)
#FF0000 → 純粋な赤
#00FF00 → 純粋な緑
#0000FF → 純粋な青

メモリアドレス

コンピュータのメモリの場所(アドレス)は16進数で表されます。

0x00000000  ← メモリの先頭
0x7FFFFFFF  ← 32ビットプロセスのアドレス空間の上限
0xDEADBEEF  ← デバッグでよく使われる意味のないダミー値

UUID(ユニークID)

ソフトウェアでよく使われる一意のID(UUID)も16進数で書かれています。

550e8400-e29b-41d4-a716-446655440000

これは128ビット(16バイト)の値を16進数32桁で表したものです。

バイナリファイルの中身(バイナリエディタ)

バイナリエディタでファイルの中身を開くと、こんな表示になります。

オフセット  16進数                              ASCII
00000000:  FF D8 FF E0 00 10 4A 46  49 46 00 01  ....JFIF..
0000000C:  01 00 00 01 00 01 00 00  FF DB 00 43  ...........C

左側のFF D8 FF E0…が16進数で表したバイトデータです。


0x プレフィックスの意味

数字が10進数か16進数かを区別するために使われます。

255   → 10進数の255
0xFF  → 16進数のFF = 10進数の255(同じ値)
0b11111111 → 2進数の11111111 = 同じく255

これがないと、10 が「10進数の十」なのか「16進数の十六(=10進数の16)」なのか区別できません。


まとめ

  • 16進数は0〜9とA〜Fの16種類の文字で値を表す
  • 16進数1桁 = 2進数4ビット(ニブル)がぴったり対応する
  • 1バイト(8ビット)= 16進数2桁(00〜FF)
  • 変換は「4ビットずつ区切るだけ」でできる
  • 実際には色コード、メモリアドレス、UUID など多くの場面で使われる
  • 0x プレフィックスは「これは16進数」という印

次回は、バイナリの足し算と「桁溢れ(オーバーフロー)」の仕組みを学びます。