2進数・8進数・10進数・16進数の使い分け|なぜ16進が選ばれるのか
結論:用途で決まる
| 基数 | よく使う場面 |
|---|---|
| 2進数 | ビット演算、フラグ、レジスタ |
| 8進数 | UNIXパーミッション(chmod) |
| 10進数 | 通常の計算、UIに表示する値 |
| 16進数 | メモリアドレス、色コード、バイト列、ハッシュ値、Unicode |
「コンピュータは2進で動く」とよく言いますが、人間が見やすい形に丸めるのが各基数の役割です。
2進数(binary)
何のためにある?
コンピュータの内部表現そのもの。CPUのレジスタ、メモリの各ビット、論理演算(AND/OR/XOR)はすべて2進。
10101010 = 170
& 11110000
─────────
10100000 = 160
使う場面
- ビットフラグ(
READ | WRITE) - マスク処理(
x & 0xFF) - ハードウェアレジスタ
- 暗号アルゴリズムの可視化
弱点
桁数が多すぎて読みにくい。2^32 を書こうとすると33桁。人間用には適さないため、内部処理にとどまり、表示・記述には16進を使います。
8進数(octal)
何のためにある?
「2進3桁を1桁で表す」もの。2^3 = 8 なので、3ビットがちょうど1桁になります。
2進: 111 101 101
8進: 7 5 5
使う場面
- UNIXパーミッション(
chmod 755) - 古いコンピュータの命令セット表記(PDP-8、PDP-10)
- C言語の文字定数(
'\077')
なぜUNIXパーミッションだけ生き残ったか
各3ビットが「読み・書き・実行」の3要素にぴったり対応するからです:
rwx rwx rwx
111 111 111 = 777(誰でも全権限)
111 101 101 = 755(所有者全権限、他は読み実行のみ)
8進1桁が「ユーザ・グループ・その他」の3カテゴリ各々の権限を表す、という設計。
10進数(decimal)
何のためにある?
人間が普段使う基数。10本の指から来ているとされ、文化的に定着しています。
使う場面
- ユーザに表示する数値
- 金額、年齢、件数
- 一般的な計算
コンピュータ的には不便
1/3 = 0.333... のような循環小数や、0.1 + 0.2 = 0.30000000000000004 のような浮動小数点誤差は、10進と2進の表現の違いから生じます。お金の計算で Decimal 型を使うのは、2進ベースの float だと正確に扱えないため。
16進数(hexadecimal)
何のためにある?
「2進4桁を1桁で表す」もの。2^4 = 16。1バイト(8bit)= 16進2桁でぴったり収まるのが最大の利点。
2進: 11111111
16進: FF
使う場面
- メモリアドレス(
0x7fff5fbff8c0) - バイト列の表示(
hexdump) - 色コード(
#3b82f6) - MACアドレス(
AA:BB:CC:DD:EE:FF) - ハッシュ値(SHA-256: 64文字の16進)
- Unicodeコードポイント(
U+1F600) - C/JavaScript の数値リテラル(
0xCAFEBABE)
なぜ16進が選ばれるのか
1バイト = 16進2桁 という対応が綺麗だから。3バイト = 6文字(色コード)、16バイト = 32文字(MD5)、32バイト = 64文字(SHA-256)。長さが安定して予測可能です。
8進だと1バイト = 2.67桁で中途半端。10進だと1バイト = 0〜255で桁数がバラバラ。16進は表示の長さが揃うので、ダンプや比較に向いています。
進数間の変換でよくあるシチュエーション
16進バイトを2進フラグとして読みたい
0xA5 = 10100101
進数変換ツール で16進数欄に A5 と入れれば、2進数欄で確認できます。
Linuxのchmod数値を理解したい
755 → rwxr-xr-x
644 → rw-r--r--
777 → rwxrwxrwx
8進数欄に入れると、2進数欄で各ビットが見えます。
Unicodeコードポイントを文字に対応させたい
0x1F600 = 128512 = 😀
0x3042 = 12354 = あ
16進・10進が同じ整数を指していることを確認できます。
進数変換が「すぐ理解できる」ようになるコツ
- 2進4桁 = 16進1桁 を暗記(
1010 = A、1111 = F) - 2進3桁 = 8進1桁 を覚える(
111 = 7) - 16進2桁 = 1バイト を意識
- 残りはツールで変換
人間が暗算で変換できる範囲はせいぜい1〜2バイト。それ以上は道具に任せるのが効率的です。
関連記事
基数は「何のために使うか」で選ばれます。ビット操作なら2進、メモリ表記なら16進、権限管理なら8進、人間用なら10進。それだけ。