1. 基本概念
1.1 基数の定義
基数(radix または base)とは、ある進数制度において使用される数字の種類数であり、各桁の値を計算する際の底(べき乗の底)となる数です。基数は、その数制度の表現能力と効率性を決定する重要な要素です。
1.2 位取り記数法
現代の進数制度は位取り記数法に基づいています。これは数値の中での各桁の位置によって、その桁が表す値の大きさ(重み)が決まる方式です。各桁の重みは、右から数えてn桁目の位置では「\({基数}^{n-1}\)」となります。
1.3 進数表記の一般形式
n進数での数値表現は、以下の数式で表すことができます:
\( (d_m d_{m-1} … d_1 d_0)_n = d_m \times n^m + d_{m-1} \times n^{m-1} + … + d_1 \times n^1 + d_0 \times n^0\)
ここで、\(d_i\)はそれぞれの桁の数字(0からn-1まで)、nは基数、添字iは桁の位置を表します。
2. 主要な進数制度
2.1 2進数(二進数制度)
基数: 2
使用する数字: 0, 1
特徴: コンピュータの内部表現の基礎となる最も基本的な進数制度です。各桁は2のべき乗(1, 2, 4, 8, 16…)の重みを持ちます。
例:
2進数の 1101
は10進数では次のように計算されます:
\((1101)_2 = 1×2^3 + 1×2^2 + 0×2^1 + 1×2^0\)
\(= 1×8 + 1×4 + 0×2 + 1×1\)
\(= 8 + 4 + 0 + 1\)
\(= 13\)
2.2 8進数(八進数制度)
基数: 8
使用する数字: 0, 1, 2, 3, 4, 5, 6, 7
特徴: 3ビット(2^3 = 8)の2進数を1桁で表現できるため、コンピュータプログラミングで使用されることがあります。
例:
8進数の 27
は10進数では次のように計算されます:
\((27)_8 = 2×8^1 + 7×8^0\)
\(= 2×8 + 7×1\)
\(= 16 + 7\)
\(= 23\)
2.3 10進数(十進数制度)
基数: 10
使用する数字: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
特徴: 人間が日常的に使用する最も一般的な進数制度です。各桁は10のべき乗(1, 10, 100, 1000…)の重みを持ちます。
例:
10進数の 356
は次のように表されます:
\((356)_{10} = 3×10^2 + 5×10^1 + 6×10^0\)
\(= 3×100 + 5×10 + 6×1\)
\(= 300 + 50 + 6\)
\(= 356\)
2.4 16進数(十六進数制度)
基数: 16
使用する数字: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A(10), B(11), C(12), D(13), E(14), F(15)
特徴: 4ビット(2^4 = 16)の2進数を1桁で表現できるため、コンピュータのメモリアドレスやカラーコードなどでよく使用されます。
例:
16進数の 1A
は10進数では次のように計算されます:
\((1A)_{16} = 1×16^1 + 10×16^0\)
\(= 1×16 + 10×1\)
\(= 16 + 10\)
\(= 26\)
3. 進数変換の方法
3.1 10進数から他の進数への変換
10進数から他の進数への変換は、目的の基数で繰り返し割り算を行い、その余りを下位の桁から順に並べる方法で行います。
例: \(42_{10}\)を2進数に変換する場合
\(42 ÷ 2 = 21 余り 0\)(最下位桁)
\(21 ÷ 2 = 10 余り 1\)
\(10 ÷ 2 = 5 余り 0\)
\(5 ÷ 2 = 2 余り 1\)
\(2 ÷ 2 = 1 余り 0\)
\(1 ÷ 2 = 0 余り 1\)(最上位桁)
したがって、\(42_{10} = 101010_2\)となります。
3.2 他の進数から10進数への変換
他の進数から10進数への変換は、各桁の数字にその位置の重み(基数のべき乗)を掛けて合計する方法で行います。
例: \(10110_2\)を10進数に変換する場合
\((10110)_2 = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^0\)
\(= 16 + 0 + 4 + 2 + 0\)
\(= 22\)
3.3 2進数と16進数の相互変換
2進数と16進数の間では、2進数の4桁が16進数の1桁に対応するため、変換が容易です。
2進数から16進数への変換: 2進数を右から4桁ずつグループ化し、各グループを対応する16進数に置き換えます。
例: \(10110111_2\)を16進数に変換する場合
\(1011\) \(0111\) → \(B\) \(7\)
したがって、\(10110111_2\) = \(B7_{16}\)となります。
16進数から2進数への変換: 各16進数の桁を対応する4桁の2進数に置き換えます。
例: 3A₁₆を2進数に変換する場合
\(3\) → \(0011\)
\(A\) → \(1010\)
したがって、\(3A_{16}\) = \(00111010_2\)となります。
4. コンピュータサイエンスにおける応用
4.1 ビットとバイト
ビット: コンピュータが扱う最小の情報単位で、0か1の値を持ちます。
バイト: 通常8ビットからなる情報単位です。1バイトは\(2^8\) = 256種類の値を表現できます。
4.2 メモリアドレスと16進数
コンピュータのメモリアドレスは通常16進数で表されます。例えば、0x1A2B3C
のような形式です。プレフィックス「0x」は16進数表記であることを示します。
4.3 カラーコードのRGB表現
Webデザインなどでは、色は#RRGGBB形式の16進数で表されます。例えば、#FF0000
は赤色を表します。各2桁の16進数(00-FF)がRed、Green、Blueの強度を表します。
4.4 論理演算とビット操作
2進数は論理演算(AND、OR、NOT、XORなど)やビット操作(シフト、ローテーションなど)と自然に対応します。これらの操作はプログラミングで頻繁に使用されます。
5. 情報処理技術者試験のポイント
5.1 頻出問題と解法
- 進数変換(特に2進数⇔10進数⇔16進数)
- 2進数での加算・減算
- 補数表現(特に2の補数)を用いた負数の表現
- 浮動小数点数の表現
5.2 重要な概念の整理
- 符号付き整数と符号なし整数の表現方法の違い
- オーバーフローとアンダーフローが発生する条件
- IEEE 754規格に基づく浮動小数点数の表現
6. 演習問題
- 次の10進数を2進数に変換しなさい: \(73_{10}\)
\(73 ÷ 2 = 36 余り 1\)(最下位桁)
\(36 ÷ 2 = 18 余り 0\)
\(18 ÷ 2 = 9 余り 0\)
\(9 ÷ 2 = 4 余り 1\)
\(4 ÷ 2 = 2 余り 0\)
\(2 ÷ 2 = 1 余り 0\)
\(1 ÷ 2 = 0 余り 1\)(最上位桁)
したがって、\(73_{10} = 1001001_2\)となります。
- 次の2進数を16進数に変換しなさい: \(10101101_2\)
\(10101101_2\) = \(1010\) \(1101\) →\(A\) \(D\) = \(AD_{16}\)
- 次の16進数を10進数に変換しなさい: \(2F_{16}\)
\(2F_{16} = 2 \times 16^1 + 15 \times 16^0 = 32 + 15 = 47_{10}\)
- 8ビットの2の補数表現で、-42を表しなさい。
- 絶対値を2進数に変換
42を2進数で表すと、
\(42 ÷ 2 = 21 余り 0 \)
\(21 ÷ 2 = 10 余り 1\)
\(10 ÷ 2 = 5 余り 0\)
\(5 ÷ 2 = 2 余り 1\)
\(2 ÷ 2 = 1 余り 0\)
\(1 ÷ 2 = 0 余り 1\)
よって\(101010_2\)となります。8ビットだと\(00101010_2\)です。 - ビット反転
各ビットを反転すると、11010101
になります。 - 1を加える
ビット反転した値に1を加えると、11010110
となります。
7. まとめ
基数と進数制度は情報処理の基礎となる重要な概念です。特に2進数、10進数、16進数の相互変換や、コンピュータ内部での数値表現について理解することは、情報処理技術者として必須のスキルです。日常の業務やプログラミングでも頻繁に使用される知識であり、実践的な応用力を身につけることが重要です。