コンピュータの世界は進数に満ちています。CSSの #1A2B3C、メモリアドレス 0x7FFFFFFF、Base64エンコード、URLの %20……これらの不思議な文字列は、すべて同じ概念——進数(Number Systems)——から来ています。理解すれば、より多くの技術の仕組みが読み解けるようになります。
1. 進数とは?
進数とは「数字を表すのに何種類の記号を使うか」というルールです。私たちが日常使う10進数(Base-10)は 0〜9 の 10 種類の記号を使い、9 の次で繰り上がって 10 になります。
- 2進数(Base-2):0 と 1 だけ。1 の次で繰り上がり 10(「いちぜろ」と読み、10進数の 2 を表す)
- 8進数(Base-8):0〜7 を使い、7 の次で繰り上がる
- 16進数(Base-16):0〜9 に加え A〜F(A=10, B=11, …, F=15)を使い、F の次で繰り上がる
| 10進数 | 2進数 | 8進数 | 16進数 |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 8 | 1000 | 10 | 8 |
| 10 | 1010 | 12 | A |
| 15 | 1111 | 17 | F |
| 16 | 10000 | 20 | 10 |
| 255 | 11111111 | 377 | FF |
2. 2進数(Base-2)
2進数はコンピュータハードウェアの言語です。電気回路には「通電」と「遮断」の2状態しかなく、それがちょうど 1 と 0 に対応します。0 か 1 の 1 桁をビット(bit)、8ビットまとめたものをバイト(byte)と呼びます。
10進数 → 2進数の変換
方法:2 で繰り返し割り算し、余りを下から上に読む。
13 ÷ 2 = 6 余り 1 ↑
6 ÷ 2 = 3 余り 0 ↑
3 ÷ 2 = 1 余り 1 ↑
1 ÷ 2 = 0 余り 1 ↑
結果:1101(10進数 13 = 2進数 1101)
2進数 → 10進数の変換
方法:各桁に 2 の累乗をかけて合計する。
1101 = 1×2³ + 1×2² + 0×2¹ + 1×2⁰
= 8 + 4 + 0 + 1
= 13
3. 16進数(Base-16)
16進数はプログラミングで最もよく使われる進数です。なぜなら、2進数と完璧な対応関係があるからです:4ビットがちょうど1桁の16進数に対応します。
2進数:1111 1010 1011 1100
16進数: F A B C → FABC
これにより、16進数はメモリアドレス、カラーコード、ハッシュ値を表すのに理想的な形式となっています——2進数より短く、底層の2進数と直接対応している。
CSSカラーコードの例
#FF5733 は3対の16進数で、それぞれ R(赤)・G(緑)・B(青)を表します:
| 色 | 16進数 | 10進数(0–255) |
|---|---|---|
| 赤(R) | FF | 255 |
| 緑(G) | 57 | 87 |
| 青(B) | 33 | 51 |
#FF5733 は rgb(255, 87, 51) と同等で、オレンジがかった赤色です。
4. URLエンコードにおける16進数
URLに使える文字は限られており、スペース・日本語・特殊記号などはパーセントエンコーディングで表現します。文字のUTF-8バイトを16進数に変換し、%を前に付けます。
| 元の文字 | URLエンコード | 説明 |
|---|---|---|
| スペース | %20 | 16進数 20 = 10進数 32(スペースのASCIIコード) |
| / | %2F | パス以外でスラッシュを使う場合 |
| 日 | %E6%97%A5 | UTF-8で3バイト |
5. Base64:よく使われるエンコード方式
Base64は進数ではなく、バイナリデータを印刷可能な文字列に変換するエンコード方式です。3バイト(24ビット)を4組の6ビットに分割し、各グループを64文字(A–Z、a–z、0–9、+、/)のいずれかに変換します。
元データ(ASCII):Man
2進数:01001101 01100001 01101110
6ビット分割:010011 010110 000101 101110
Base64: T W F u → TWFu
Base64の出力はもとのデータより約33%大きくなりますが、メールのHTMLやJSON属性など、テキストのみのチャネルでバイナリを安全に送れます。
6. 各言語での進数表記
| 言語 | 2進数 | 8進数 | 16進数 |
|---|---|---|---|
| Python | 0b1010 | 0o12 | 0xA |
| JavaScript | 0b1010 | 0o12 | 0xA |
| C / C++ | —(ネイティブ構文なし) | 012 | 0xA |
| Java | 0b1010 | 012 | 0xA |
| CSS | — | — | #FF5733 |
まとめ
進数は難解な理論ではなく、多くの日常的な技術を理解するための鍵です:
- 2進数はコンピュータ底層の言語、ビット演算の基礎
- 16進数はプログラミングの共通語。カラーコード・メモリアドレス・ハッシュ値はすべて16進数で表現される
- Base64は2進数の上に構築され、テキスト環境でのバイナリ転送問題を解決する
- URLエンコードは許可されない文字を16進数で標記し、URLに任意の文字を含められるようにする
これらの基礎を理解すれば、%E6%97%A5・#FF5733・TWFu といった文字列を見た瞬間に意味が読み解けるようになります。