2進数とは、0と1の2種類の数字だけで値を表す方法です。16進数は、0〜9とA〜Fの16種類で値を表します。どちらも同じ値の書き方を変えたもので、16進数は長いビット列を短く読むためによく使われます。

「01000001」「65」「0x41」は、文脈によってはすべて同じ値です。違うのは値そのものではなく、何進数で書いたかです。
同じ値を3通りで書いてみる
memo.txtへ半角英字のAを入力し、UTF-8で保存する例を使います。ASCII範囲のAはUTF-8でも1バイトで、数値としては10進数65、2進数01000001、16進数41です。

2進数は桁が上がるたびに2倍になる
普段使う10進数では、右端から1、10、100、1000と、桁が上がるたびに重みが10倍になります。2進数では、右端から1、2、4、8、16、32、64、128と2倍になります。
| 2進数の桁 | 重み | 01000001で使うか |
|---|---|---|
| 左から1桁目 | 128 | 0 |
| 左から2桁目 | 64 | 1 |
| 左から3〜7桁目 | 32・16・8・4・2 | すべて0 |
| 右端 | 1 | 1 |
01000001では、64の桁と1の桁が1です。したがって、10進数へ直すと64 + 1 = 65になります。
2進数 01000001
= 0×128 + 1×64 + 0×32 + 0×16
+ 0×8 + 0×4 + 0×2 + 1×1
= 65(10進数)
なぜコンピュータは2進数を使うのか
デジタル回路では、電圧が高い・低い、スイッチがオン・オフといった2つの状態を区別し、それを0と1へ対応づけると安定して扱いやすくなります。データや命令は、多数のビットを組み合わせたパターンとして表現されます。
16進数は4ビットを1桁で書ける
16進数では、10〜15をA〜Fで表します。2進数4桁で作れる組み合わせは0000から1111まで16通りなので、4ビットを16進数1桁へぴったり対応させられます。
| 2進数 | 10進数 | 16進数 |
|---|---|---|
| 0000 | 0 | 0 |
| 0001 | 1 | 1 |
| 0010 | 2 | 2 |
| 0011 | 3 | 3 |
| 0100 | 4 | 4 |
| 0101 | 5 | 5 |
| 0110 | 6 | 6 |
| 0111 | 7 | 7 |
| 1000 | 8 | 8 |
| 1001 | 9 | 9 |
| 1010 | 10 | A |
| 1011 | 11 | B |
| 1100 | 12 | C |
| 1101 | 13 | D |
| 1110 | 14 | E |
| 1111 | 15 | F |
01000001を4ビットずつ区切ると0100 0001です。左の0100は16進数4、右の0001は1なので、41になります。
0xは「ここから16進数」という印
プログラムやログでは、16進数を0x41のように書くことがあります。先頭の0xは値の一部ではなく、「この数字列は16進数として読んでください」という接頭辞です。2進数は0b01000001と書く言語もあります。
16進数はどこで使われるのか
16進数は、メモリアドレス、バイト列、文字コード、色コード、通信データなどで使われます。たとえばWebの色#00A9DFは、赤・緑・青の各成分を2桁の16進数で表したものです。
文字Aと数値65の対応そのものは文字コードの規則です。詳しくは文字コードとは、ビットとバイトの単位はビットとバイトの違いで確認できます。
まとめ:2進数と16進数の関係
2進数とは、2つの状態を0と1へ対応づけて値を表す方法です。長い2進数は4ビットずつ区切って16進数へ直すと読みやすくなります。まずは01000001 → 0100 0001 → 0x41の変換を軸に覚えましょう。
関連する基礎用語
- CPUとは:ビット列として表される命令を実行するCPUへつなぐ
