コンピューターの世界では、10進数・2進数・8進数・16進数という4種類の数体系が使われています。
このうち8進数と16進数はどちらも2進数と密接な関係を持ちますが、それぞれ異なる特徴と用途があります。
8進数と16進数の違いを正しく理解することで、プログラミングやUNIX系システムの操作など実務での知識が深まるでしょう。
本記事では、8進数と16進数の基数の違い・特徴・用途・変換方法・計算システムでの活用まで、わかりやすく解説していきます。
8進数と16進数の基本的な違い
それではまず、8進数と16進数の基本的な違いについて解説していきます。
8進数(Octal)は8を基数とする数体系で、0〜7の8種類の記号を使います。
一方、16進数(Hexadecimal)は16を基数とする数体系で、0〜9とA〜Fの16種類の記号を使うという点が大きな違いです。
| 項目 | 8進数 | 16進数 |
|---|---|---|
| 基数 | 8 | 16 |
| 使用する記号 | 0〜7 | 0〜9、A〜F |
| 2進数との対応 | 3ビット | 4ビット |
| 接頭辞(C言語系) | 0(ゼロ) | 0x |
| 主な用途 | UNIX権限・古いシステム | メモリ・色・文字コード等 |
8進数の1桁は2進数3ビット、16進数の1桁は2進数4ビットに対応するという点が重要な違いです。
8と16はどちらも2のべき乗(2^3と2^4)であるため、2進数との変換が容易という共通の特性があります。
8進数の特徴と使われる場面
8進数は現在では16進数ほど広く使われていませんが、UNIXやLinuxのファイルパーミッション(権限)設定で今も重要な役割を果たしています。
「chmod 755」「chmod 644」のように、ファイルの読み取り・書き込み・実行権限を8進数3桁で表現するのがUNIX系システムの慣例です。
C言語では数値リテラルの先頭に「0(ゼロ)」を付けると8進数と解釈されるため、「0755」と書くことでパーミッション値を8進数で指定できるでしょう。
16進数の特徴と使われる場面
16進数は現代のプログラミングやシステム開発で最も広く使われる数体系のひとつです。
メモリアドレス・カラーコード・文字コード・暗号ハッシュ値・MACアドレスなど、コンピューターサイエンスのほぼすべての分野で16進数が活用されています。
1バイト(8ビット)をちょうど2桁の16進数で表現できるという特性が、バイト指向のコンピューターシステムとの相性を良くしているのです。
現代のプログラミング言語のほとんどが16進数リテラルをサポートしており、デバッグやバイナリ解析でも不可欠な表記方式といえるでしょう。
8進数と16進数の変換方法
続いては、8進数と16進数の変換方法を確認していきます。
2進数を中継点として使うと、8進数と16進数の相互変換が効率よく行えます。
8進数から16進数への変換手順
8進数から16進数へ直接変換するよりも、一度2進数に変換してから16進数に変換する2段階アプローチが確実です。
8進数「752」を16進数に変換する
ステップ1:各桁を3ビットの2進数に変換
7→111 5→101 2→010
2進数:111 101 010
ステップ2:右から4ビットずつ区切り直す
1 1110 1010 → 先頭に0を補って 0001 1110 1010
ステップ3:4ビットずつ16進数に変換
0001→1 1110→E 1010→A
答え:8進数「752」= 16進数「1EA」
2進数を中継点にすることで、桁ごとの機械的な変換が可能となります。
手作業での変換は少し手間がかかりますが、仕組みを理解する上で重要な練習となるでしょう。
16進数から8進数への変換手順
16進数「1EA」を8進数に変換する
ステップ1:各桁を4ビットの2進数に変換
1→0001 E→1110 A→1010
2進数:0001 1110 1010
ステップ2:右から3ビットずつ区切り直す
1 111 010 10 → 先頭に0を補って 001 111 010 010
ステップ3:3ビットずつ8進数に変換
001→1 111→7 010→2((※先ほどと逆に3ビット区切り)
ステップ4の続き:010→2 010→2(適切に区切り直す)
正確な区切り:001 110 100 010 → 1,6,4,2 → 8進数「1642」
Pythonを使えば「oct(int(‘1EA’, 16))」で一発変換できるため、実務では計算ツールを活用するとよいでしょう。
Pythonでの8進数・16進数変換
Pythonでの8進数・16進数相互変換
8進数→10進数:int(‘752’, 8) → 490
10進数→8進数:oct(490) → ‘0o752’
16進数→10進数:int(‘1EA’, 16) → 490
10進数→16進数:hex(490) → ‘0x1ea’
8進数→16進数:hex(int(‘752’, 8)) → ‘0x1ea’
Pythonでは8進数リテラルを「0o752」のように「0o」接頭辞で表記します(旧来の「0752」形式はPython3では使用不可)。
計算システムでの用途と使い分け
続いては、8進数と16進数の計算システムでの用途と使い分けを確認していきます。
UNIXパーミッションでの8進数活用
LinuxやUNIXのファイルパーミッションは8進数3桁で表現されます。
「rwx」(読み取り・書き込み・実行)の各権限を2進数3ビットで表し、それを8進数1桁に変換する仕組みです。
UNIXパーミッションと8進数の対応
r(読み取り)=4(100)
w(書き込み)=2(010)
x(実行)=1(001)
rwx=7、rw-=6、r-x=5、r–=4
chmod 755 → rwxr-xr-x(所有者:全権限、グループ・その他:読取+実行)
この仕組みを理解することで、「chmod 755」や「chmod 644」のような権限設定コマンドの意味がすぐにわかるようになるでしょう。
16進数が主流となった理由
現代のコンピューターシステムでは8進数よりも16進数が圧倒的に多く使われています。
その主な理由は、現代のコンピューターが8ビット(1バイト)を基本単位として設計されており、1バイト=2桁の16進数という対応が非常に直感的だからです。
8進数の1桁は3ビットに対応するため、8ビット境界(バイト境界)とうまく一致せず、バイト単位での操作がしにくいという欠点があります。
この理由から、プログラミング・デバッグ・プロトコル仕様の記述などほぼすべての場面で16進数が使われているのでしょう。
まとめ
本記事では、8進数と16進数の基数の違い・特徴・用途・変換方法・計算システムでの活用まで詳しく解説してきました。
8進数は3ビット対応でUNIXパーミッション設定に活用され、16進数は4ビット(1バイト=2桁)対応で現代のプログラミング・システム開発全般に活用されています。
2進数を中継点とした相互変換の手順を理解することで、どちらの数体系も正確に扱えるようになるでしょう。
両者の特性と使い分けを理解することで、コンピューターサイエンスの理解が一層深まるはずです。