1. 概要
デジタル技術の基盤を支える基数(進数)システムは、情報処理技術者にとって必須の知識です。日常で使用する10進数とは異なり、コンピュータの世界では2進数、8進数、16進数が重要な役割を果たしています。
コンピュータの内部では電気信号のON/OFF(0と1)という2つの状態しか扱えないため、2進数が基本となります。しかし2進数は桁数が多くなりがちで人間には扱いにくいため、8進数や16進数といった2進数と親和性の高い基数も併用されています。
本記事では、各基数の特徴、プログラミングでの記法、位取り記数法の仕組み、そして実用的な変換手法について体系的に解説します。これらの知識は、プログラミング、システム設計、デバッグ作業において日常的に活用される重要なスキルとなります。
2. 詳細解説
2.1. 位取り記数法の基本原理
位取り記数法とは、数字の「位置」によってその数字が持つ値の重みを決定する数の表記法です。各桁の位置は基数のべき乗で表され、右端を0乗として左に向かって指数が増加します。
一般的な位取り記数法の表現: $$\text{数値} = \sum_{i=0}^{n-1} d_i \times \text{基数}^i$$
ここで、\(d_i\)は各桁の数字、\(i\)は桁の位置(右から0, 1, 2, …)を表します。
例:10進数 356の場合 $$356_{10} = 3 \times 10^2 + 5 \times 10^1 + 6 \times 10^0 = 300 + 50 + 6 = 356$$
例:2進数 1101の場合 $$1101_2 = 1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 = 8 + 4 + 0 + 1 = 13_{10}$$
2.2. 各基数システムの特徴
2進数(Binary)
- 使用記号: 0, 1
- 基数: 2
- 特徴: コンピュータの内部表現の基本
- 桁の重み: \(2^0, 2^1, 2^2, 2^3, …\)(1, 2, 4, 8, …)
8進数(Octal)
- 使用記号: 0, 1, 2, 3, 4, 5, 6, 7
- 基数: 8
- 特徴: 3桁の2進数を1桁で表現可能
- 桁の重み: \(8^0, 8^1, 8^2, 8^3, …\)(1, 8, 64, 512, …)
10進数(Decimal)
- 使用記号: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
- 基数: 10
- 特徴: 人間が日常的に使用する数体系
- 桁の重み: \(10^0, 10^1, 10^2, 10^3, …\)(1, 10, 100, 1000, …)
16進数(Hexadecimal)
- 使用記号: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
- 基数: 16
- 特徴: 4桁の2進数を1桁で表現可能
- 桁の重み: \(16^0, 16^1, 16^2, 16^3, …\)(1, 16, 256, 4096, …)
2.3. プログラミング言語での基数記法
多くのプログラミング言語では、基数を明確に示すための接頭辞記法が用いられます:
2進数記法
0b1101 # 2進数で13(10進数)
0B1010 # 2進数で10(10進数)
8進数記法
0755 # 8進数で493(10進数)
0o755 # より明示的な8進数記法(Python 3以降)
16進数記法
0x1F # 16進数で31(10進数)
0XFF # 16進数で255(10進数)
言語別の基数記法比較表
| 言語 | 2進数 | 8進数 | 16進数 |
|---|---|---|---|
| C/C++ | – | 0755 | 0xFF |
| C++14以降 | 0b1010 | 0755 | 0xFF |
| Java | – | 0755 | 0xFF |
| Java 7以降 | 0b1010 | 0755 | 0xFF |
| Python | 0b1010 | 0o755 | 0xFF |
| JavaScript | 0b1010 | 0o755 | 0xFF |
| Go | 0b1010 | 0755 | 0xFF |
| Rust | 0b1010 | 0o755 | 0xFF |
2.4. 基数変換アルゴリズム
10進数から他の基数への変換
目的の基数で繰り返し割り算を行い、余りを逆順に並べる方法
例:45₁₀ → 2進数
45 ÷ 2 = 22 余り 1
22 ÷ 2 = 11 余り 0
11 ÷ 2 = 5 余り 1
5 ÷ 2 = 2 余り 1
2 ÷ 2 = 1 余り 0
1 ÷ 2 = 0 余り 1
余りを逆順:101101₂
他の基数から10進数への変換
各桁に基数のべき乗を掛けて合計する方法
例:1A3₁₆ → 10進数 $$1A3_{16} = 1 \times 16^2 + 10 \times 16^1 + 3 \times 16^0$$ $$= 1 \times 256 + 10 \times 16 + 3 \times 1 = 256 + 160 + 3 = 419_{10}$$
2進数と8進数・16進数の直接変換
2進数 ↔ 8進数: 3桁ずつグループ化
101110₂ = 101|110 = 5|6 = 56₈
2進数 ↔ 16進数: 4桁ずつグループ化
11011110₂ = 1101|1110 = D|E = DE₁₆
2.5. 2進数の算術演算
加算規則
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10 (桁上がり)
例:1101₂ + 1011₂
1101
+ 1011
------
11000
減算規則
0 - 0 = 0
1 - 0 = 1
1 - 1 = 0
0 - 1 = 1 (借り)
乗算・除算
10進数と同様のアルゴリズムを使用しますが、各桁の計算は2進数の規則に従います。
2.6. コンピュータでの数値表現
符号付き整数表現
- 符号ビット方式: 最上位ビットで符号を表現
- 2の補数方式: 負数を効率的に表現(最も一般的)
8ビット2の補数での-5の表現:
- 5の2進表現:00000101
- ビット反転:11111010
- 1を加算:11111011
浮動小数点数表現(IEEE 754)
- 単精度(32ビット): 符号(1) + 指数部(8) + 仮数部(23)
- 倍精度(64ビット): 符号(1) + 指数部(11) + 仮数部(52)
3. 実用例
3.1. システムプログラミングでの活用
ファイル権限(UNIX/Linux)
chmod 755 file.txt
# 7(111₂) = rwx (所有者)
# 5(101₂) = r-x (グループ)
# 5(101₂) = r-x (その他)
ビット操作
#define FLAG_READ 0x01 // 00000001
#define FLAG_WRITE 0x02 // 00000010
#define FLAG_EXECUTE 0x04 // 00000100
int permissions = FLAG_READ | FLAG_WRITE; // 00000011
if (permissions & FLAG_WRITE) {
// 書き込み権限チェック
}
3.2. Web開発での活用
HTMLカラーコード
.red-button {
background-color: #FF0000; /* 赤:FF(255), 緑:00(0), 青:00(0) */
}
.custom-color {
background-color: #3A7BD4; /* 58, 123, 212 in decimal */
}
CSS透明度(Alpha値)
.semi-transparent {
background-color: rgba(255, 0, 0, 0.5); /* 50%透明度 */
/* 16進数表記: #FF000080 (80は128/255 ≈ 0.5) */
}
3.3. ネットワーク技術での活用
IPアドレスとサブネット
IPアドレス: 192.168.1.1
2進表現: 11000000.10101000.00000001.00000001
サブネットマスク: 255.255.255.0 (/24)
2進表現: 11111111.11111111.11111111.00000000
MACアドレス
MAC: 00:1A:2B:3C:4D:5E
各オクテットは16進数2桁(8ビット)で表現
3.4. 組み込みシステムでの活用
レジスタ操作
// STM32マイコンのGPIOレジスタ設定例
GPIOA->MODER |= 0x00000001; // PA0をOutput modeに設定
GPIOA->ODR |= 0x00000001; // PA0をHIGHに設定
I2Cアドレス
#define SENSOR_ADDR 0x48 // 7ビットアドレス
#define EEPROM_ADDR 0xA0 // 8ビットアドレス(書き込み)
3.5. デバッグとトラブルシューティング
メモリダンプの読み方
Address : +0 +1 +2 +3 +4 +5 +6 +7 ASCII
0x1000 : 48 65 6C 6C 6F 20 57 6F Hello Wo
0x1008 : 72 6C 64 21 00 00 00 00 rld!....
エラーコードの16進数表現
Windows: 0x80070005 (Access Denied)
HTTP Status: 0x194 = 404 (Not Found)
4. 例題
例題1:基数変換
問題: 10進数の156を2進数、8進数、16進数に変換してください。
解答:
- 2進数への変換:
156 ÷ 2 = 78 余り 078 ÷ 2 = 39 余り 039 ÷ 2 = 19 余り 119 ÷ 2 = 9 余り 19 ÷ 2 = 4 余り 14 ÷ 2 = 2 余り 02 ÷ 2 = 1 余り 01 ÷ 2 = 0 余り 1
156₁₀ = 10011100₂ - 8進数への変換:
156 ÷ 8 = 19 余り 419 ÷ 8 = 2 余り 32 ÷ 8 = 0 余り 2
156₁₀ = 234₈ - 16進数への変換:
156 ÷ 16 = 9 余り 12(C)9 ÷ 16 = 0 余り 9
156₁₀ = 9C₁₆
検証:
- 10011100₂ = 128+16+8+4 = 156₁₀ ✓
- 234₈ = 2×64+3×8+4×1 = 156₁₀ ✓
- 9C₁₆ = 9×16+12×1 = 156₁₀ ✓
例題2:プログラミング記法の読み取り
問題: 以下のコード中の数値を10進数で表してください。
int binary_val = 0b11010110;
int octal_val = 0755;
int hex_val = 0xDEADBEEF;
解答:
- 0b11010110: 128+64+16+4+2 = 214₁₀
- 0755: 7×64+5×8+5×1 = 448+40+5 = 493₁₀
- 0xDEADBEEF: 13×16³+14×16²+10×16¹+13×16⁰+11×16³+14×16²+14×16¹+15×16⁰ = 3,735,928,559₁₀
例題3:2進数演算
問題: 以下の2進数の演算を行ってください。
- 1101₂ + 1011₂
- 1100₂ – 0101₂
- 101₂ × 110₂
解答:
- 1101₂ + 1011₂
1101 + 1011 ------ 11000 (24₁₀) - 1100₂ – 0101₂
1100 - 0101 ------ 0111 (7₁₀) - 101₂ × 110₂
101 × 110 ------- 000 101 101 ------- 11110 (30₁₀)
例題4:実践的なビット操作
問題: 8ビットの値 0b11010110 に対して以下の操作を行った結果を求めてください。
- 3ビット目をクリア(右端を0ビット目とする)
- 1ビット目をセット(右端を0ビット目とする)
- 全ビットを反転
解答: 初期値: 0b11010110 (214₁₀)
ビット位置: 7 6 5 4 3 2 1 0
初期値: 1 1 0 1 0 1 1 0
- 3ビット目をクリア:
11010110 & 11110111 = 11010110 (変化なし、既に0のため) - 1ビット目をセット:
11010110 | 00000010 = 11010110 (変化なし、既に1のため) - 全ビットを反転:
~11010110 = 00101001 (41₁₀)
例題5:カラーコードの変換
問題: RGB値 (255, 128, 64) を16進数カラーコードに変換してください。
解答:
- Red: 255₁₀ = FF₁₆
- Green: 128₁₀ = 80₁₆
- Blue: 64₁₀ = 40₁₆
カラーコード: #FF8040
5. まとめ
基数システムの理解は、情報処理技術者にとって不可欠なスキルです。本記事で解説した内容を総括すると:
重要なポイント
- 位取り記数法の原理を理解することで、あらゆる基数変換が論理的に行えます
- プログラミング言語での記法(0b, 0o, 0x)を覚えることで、コードの読み書きが効率化されます
- 2進数と他の基数の関係(3桁→8進数、4桁→16進数)を活用すると変換が高速化できます
- 実用場面での応用を知ることで、理論と実践を結びつけられます
学習の次のステップ
- ビット演算(AND, OR, XOR, シフト)の詳細な学習
- IEEE 754浮動小数点標準の深い理解
- 2の補数表現と符号なし表現の使い分け
- 暗号化アルゴリズムにおける基数の役割
これらの知識は、システム設計、パフォーマンス最適化、セキュリティ対策、組み込み開発など、あらゆる技術分野で活用されます。日常的にコードを書く際も、適切な基数表現を選択することで、より読みやすく効率的なプログラムを作成できるでしょう。
基数は単なる数学的概念ではなく、デジタル技術の根幹を支える実用的なツールです。継続的に練習と応用を重ね、これらの知識を自在に使いこなせるようになることが、熟練した情報処理技術者への道筋となります。

