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進数 |
|---|---|---|
| 0 | 0 | 0000 |
| 1 | 1 | 0001 |
| 2 | 2 | 0010 |
| 3 | 3 | 0011 |
| 4 | 4 | 0100 |
| 5 | 5 | 0101 |
| 6 | 6 | 0110 |
| 7 | 7 | 0111 |
| 8 | 8 | 1000 |
| 9 | 9 | 1001 |
| 10 | A | 1010 |
| 11 | B | 1011 |
| 12 | C | 1100 |
| 13 | D | 1101 |
| 14 | E | 1110 |
| 15 | F | 1111 |
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
0xFF の 0x は「これは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進数 | 意味のある場面 |
|---|---|---|
| 0x00 | 0 | NUL文字、アドレスの最小値 |
| 0x0A | 10 | 改行文字(LF) |
| 0x20 | 32 | スペース文字 |
| 0x41 | 65 | 英字「A」(ASCII) |
| 0x61 | 97 | 英字「a」(ASCII) |
| 0x7F | 127 | ASCII最大値 |
| 0xFF | 255 | 1バイト最大値 |
| 0x100 | 256 | 1バイトを超えた最小値 |
実際の使い場面
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進数」という印
次回は、バイナリの足し算と「桁溢れ(オーバーフロー)」の仕組みを学びます。