数の表現:2進数と16進数
人間は両手の指が10本あることから、自然と「10進数」を標準としてきました。しかし、電球(トランジスタ)の明滅で情報を表すコンピュータにとっては「2進数」こそが自然な言語です。この節では、2つの世界を繋ぐ数の表現を学びます。
1. 10進数と2進数の本質
私たちが日常使う10進数(Decimal)は、0 から 9 までの10個の記号を使い、9 の次に値が増えると「桁上がり」が発生する仕組みです。
一方、コンピュータが使う2進数(Binary)は、0 と 1 の2つの記号しか使いません。そのため、1 の次に値が増えると、すぐに上の桁へ桁上がりします。
例えば、2進数の 101 は、次のような意味を持っています:
2進数の 101 = (1 × 2²) + (0 × 2¹) + (1 × 2⁰) = 4 + 0 + 1 = 5
2. なぜ2進数を使うのか?(物理的安定性)
「なぜ10進数で動くコンピュータを作らないのか」という疑問が湧くかもしれません。 技術的には、電流の強さを10段階(0V, 1V, 2V ... 9V)に分けて10進数回路を作ることも可能です。しかし、これは現実には極めて不安定になります。
電気ノイズによって電圧が「4.9V」に揺れたとき、それが 4 なのか 5 なのかを正確に判別するのは困難です。
一方、2進数のように「電圧がほぼゼロ(0)か、それとも高い(1)か」という2つの状態だけであれば、多少のノイズがあっても間違いなく判別できます。
この物理的なシンプルさと圧倒的な安定性こそが、コンピュータが2進数を採用する最大の理由です。
3. 人間のための「16進数 (Hexadecimal)」
2進数は機械にとって完璧ですが、人間には読みづらいという欠点があります。
例えば、10進数の 202 を2進数にすると 11001010。桁数が多く、一目では理解できません。
そこで登場するのが「16進数」です。16進数は、0 〜 9 の数字のあとに A, B, C, D, E, F(10〜15を表す)を補った、16で桁上がりする数え方です。
16進数を使う最大の理由は、「2進数の4桁(4ビット)が、16進数のちょうど1桁」に美しく収まるためです。
- 2進数の最小の4桁
0000= 16進数の0 - 2進数の最大の4桁
1111= 16進数のF
2進数の 11001010 は、4ビットずつに区切ると 1100 と 1010 になります。
これを16進数に翻訳すると、1100 = C (12)、1010 = A (10) となり、あわせて CA と短く簡潔に表記できます。
プログラミングで、16進数の値には先頭に 0x をつけて 0xCA のように書く習慣があります。これは、単なる「CA」という文字列ではなく、「16進数の数である」ことを表す約束事です。
4. 3つの表現の対応表
コンピュータサイエンスで頻出する「0から15まで」の対応表です。この関係性を頭に入れておくと、コンピュータの動きを推測する強力な武器になります。
| 10進数 | 2進数(4ビット) | 16進数 |
|---|---|---|
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 2 | 0010 | 2 |
| 3 | 0011 | 3 |
| 4 | 0100 | 4 |
| 5 | 0101 | 5 |
| 6 | 0110 | 6 |
| 7 | 0111 | 7 |
| 8 | 1000 | 8 |
| 9 | 1001 | 9 |
| 10 | 1010 | A |
| 11 | 1011 | B |
| 12 | 1100 | C |
| 13 | 1101 | D |
| 14 | 1110 | E |
| 15 | 1111 | F |
2進数や16進数などのn進数を10進数に変換するときは、「各桁の数字 × その桁の重み(基数のべき乗)」をすべて足し合わせます。
- 2進数
1101を10進数にする場合:
(1 × 2³) + (1 × 2²) + (0 × 2¹) + (1 × 2⁰) = 8 + 4 + 0 + 1 = 13 - 16進数
A5を10進数にする場合(Aは10を表す):
(10 × 16¹) + (5 × 16⁰) = 160 + 5 = 165
桁の重みは、小数点から左(整数部分)に向かって n⁰, n¹, n², n³ ... と増えていき、右(小数部分)に向かって n⁻¹, n⁻², n⁻³ ... と減っていきます。この規則性を意識すると、あらゆる基数変換で迷うことがなくなります。