18.1.2 2進法, 16進法と8進法

コンピュータの中では情報が 0, 1 の羅列で表されるため,符号化方法を知るには 2 進法の理解が欠かせません.また 2 進法に関連して,人間がデータを読むために補助的に 16 進法と 8 進法が用いられます.そこで 2 進法と,関連する 16 進法および 8 進法について学びましょう.

2 進法

2 進法は 2 の累乗を位取りの基準として取る表記法です.2 より小さい非負整数は 0 と 1 の 2 つしかありませんから,2 進法では数字として 0, 1 のみを用い,全ての数を 0 と 1 の列で表現します.また 2 進法の各位は右から順に 1 の位, 2 の位, 4 の位, 8 の位, … というようになります.たとえば 10 進法で

729 = 1 * 512 + 0 * 256 + 1 * 128 + 1 * 64 + 0 * 32 + 1 * 16 + 1 * 8 + 0 * 4 + 0 * 2 + 1 * 1

ですから,729(10) = 1011011001(2) となります.

16 進法

16 進法は 2 ではなく 16 の累乗を繰り上がりの単位にとる表記法です.16 進法では 1 つの位を表すのに 0 から 15 までの数字が必要になり,私たちが普段使う数字 0 ~ 9 だけでは足りなくなってしまいます.そこで情報科学の分野では足りない数字を補うのに A, B, C, D, E, F を用いるという習わしがあり,10 進法の 10 から 15 をこの順番で A から F に割り当てます.つまり A(16) = 10(10), B(16) = 11(10), C(16) = 12(10), D(16) = 13(10), E(16) = 14(10), F(16) = 15(10) というわけです.たとえば

1019 = 3 * 256 + 15 * 16 + 11 * 1

ですから 1019(10) = 3FB(16) となります.

さて 16 = 24 ですから,16 進法での 1 桁はちょうど 2 進法での 4 桁に対応します.その対応は次の表の通りです.

2 進法 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
16 進法 0 1 2 3 4 5 6 7 8 9 A B C D E F

ですから,2 進法から 16 進法に変換するときはまず 0, 1 の列を下から 4 桁ずつに区切り,それぞれの 4 桁を上の表にしたがって読み替えれば良いということになります.たとえば 01101011011011101001(2) を 4 桁ずつに区切ると 0110 1011 0110 1110 1001 なので

0110 1011 0110 1110 1001(2) = 6B6E9(16)

となります.16 進法から 2 進法に読み替える場合は逆に,まず 16 進数の各位を 2 進法の 4 桁の数字読み替えてから,それらを繋げます.

人間はコンピュータと違って一度に何種類もの文字を認識でき,また長い文字列に対する耐性がコンピュータより弱いですから,人間にとっては 2 進法より 16 進法の方が見やすいと言えるでしょう.後で学ぶように 1 バイトという単位の情報は 8 桁の 2 進数で表されますが, 0, 1 からなる 8 桁の列より 0, 1, …, F からなる 2 桁の列の方が人間に優しいのは一目瞭然です.こういう理由でコンピュータの扱う情報が 16 進法で表されることが良くありますので,皆さんも慣れておいてください.

8 進法

8 進法は 8 の累乗を位取りに使う表記法です.ここまで来れば詳細な説明は不要でしょう.8 進法の 1 桁が 2 進法の 3 桁にちょうど対応するので,16 進法のときと同じく,8 進法と 2 進法との読み替えは簡単にできます.しかし 16 進法の使われる頻度が圧倒的に高いため,8 進法表記にお目にかかることはあまりありません.