私たちは指が10本あるので10進数(base 10)で数えます。コンピュータは線が「オンかオフか」なので2進数(base 2)で数えます。プログラマーは2進数を簡潔に書ける16進数(base 16)を好みます。低レイヤーを触るようになると基数の変換は日常作業で、見た目ほど難しくありません。
「基数(base)」とは何か
基数とは「各桁で使える記号の数」と「各位置の重み」のことです:
- 10進数(10):数字 0–9。位の重みは 1、10、100、1000⋯
- 2進数(2):数字 0–1。重みは 1、2、4、8、16⋯
- 8進数(8):数字 0–7。重みは 1、8、64⋯
- 16進数(16):0–9 に a–f(a=10 ⋯ f=15)。重みは 1、16、256⋯
つまり2進数 1010 = 8 + 0 + 2 + 0 = 10進数の 10、16進数 ff = 15×16 + 15 = 255 です。
なぜ2進数ではなく16進数?
2進数は正確ですが読みにくい——11111111 と ff。16 は 2⁴ なので、16進数の1桁がちょうど2進数の4桁に対応し、16進数は2進数の無損な省略記法になります。だから色(#3388cc)、メモリアドレス(0x7ffe)、Unicode コードポイント(U+1F600)は16進数で書かれます。
唯一の落とし穴:同じ数字でも基数が違えば別の数
10 は10進数で十、2進数で二、8進数で八、16進数で十六です。数字の並びは、それがどの基数かを知るまで意味を持ちません。変換ミスの多くはここ——100 を百だと思ったら実は2進数の四だった、という具合です。
テキストもただのバイト
「テキスト→2進数」が成り立つのは、各文字が(UTF-8 で)バイトとして保存され、各バイトが8ビットだからです。文字 A はバイト 65 = 2進数 01000001 = 16進数 41。絵文字や非ラテン文字は複数バイトになりますが、考え方は同じです。
ブラウザ内で即変換
基数変換ツールは4つの基数を連動させ、どれかに入力すると他が即更新されます。BigInt を使うので巨大な数も正確で、UTF-8 でテキストを2進数や Hex に変換・復元もできます。
関連ツール
- バイトを転送用に符号化?Base64 ツールを。
- 16進数の色コードを扱う?カラー変換をどうぞ。
早見表
下の表はどの行も同じ数を 4 つの基数で書いたものです。手元に置くと便利です:
| 10進 | 2進 | 16進 | 8進 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 8 | 1000 | 8 | 10 |
| 10 | 1010 | A | 12 |
| 15 | 1111 | F | 17 |
| 16 | 10000 | 10 | 20 |
| 64 | 1000000 | 40 | 100 |
| 100 | 1100100 | 64 | 144 |
| 128 | 10000000 | 80 | 200 |
| 255 | 11111111 | FF | 377 |
| 256 | 100000000 | 100 | 400 |
| 1024 | 10000000000 | 400 | 2000 |
覚えておく価値があるのは 255 = 0xFF = 0b11111111 の行——1 バイト(8 ビット)が保持できる最大値です。
手で変換する
- 10進 → 2進: 2 で割り続け、余りを下から読む。
13→ 6 余り 1、3 余り 0、1 余り 1、0 余り 1 →1101。 - 2進 → 10進: 各位の重みを足す。
1101= 8 + 4 + 0 + 1 =13。 - 2進 ↔ 16進: 右から 4 ビットずつまとめる。
11111111→1111 1111→F F→FF。 - 16進 → 10進: 各桁に 16 のべき乗を掛ける。
0x2A= 2×16 + 10 =42。
接頭辞の意味
同じ数字でも基数が違えば別の数になるため、コードは接頭辞で基数を示します:0x は16進(0xFF)、0b は2進(0b1010)、0o(C 言語では先頭の 0)は8進(0o17)。接頭辞がなければ10進です。こうした計算を手でやりたくないときは、CSS カラー形式の実用ガイドが同じ16進を Web の色でどう使うかを示しています。