n進法の変換方法を完全理解! 計算手順と具体例で学ぶ、あなたも絶対マスターできる徹底解説
「n進法」と聞くと、何だか難しそう、コンピュータの世界の話でしょう? と感じる方も多いかもしれません。しかし、n進法は私たちの身近な世界にも深く関わっており、その仕組みを理解することは、情報の扱い方を理解する上で非常に役立ちます。特に、現代のデジタル技術の根幹を成すコンピュータは、2進法というn進法の一つで動いています。
普段、私たちは10進法という数え方を当たり前のように使っていますが、なぜ「10」になったのでしょうか? 指が10本あるから? その通りかもしれません。しかし、数字の数え方は10だけに限られません。2でも、8でも、16でも、あるいはそれ以外のどんな整数(1より大きい)でも、数を表現することができます。これが「n進法」の考え方です。
n進法の理解は、コンピュータの仕組みを深く知るためだけでなく、プログラミング、ネットワーク、データサイエンスなど、様々な分野で必須の知識となります。また、数学的な思考力を養う上でも非常に有効です。
この記事では、n進法の基本から、最も重要な「変換方法」までを、計算手順と豊富な具体例を交えながら、誰でも完全に理解できるように徹底的に解説します。約5000語のボリュームで、あなたのn進法に対する疑問を全て解消し、自信を持って扱えるように導きます。
さあ、一緒にn進法の世界を探求し、その変換方法をマスターしましょう!
目次
- はじめに:n進法とは何か? なぜ学ぶのか?
- 10進法のおさらい:私たちが使う数の仕組み
- n進法の基本原理:位取りと基数
- 10進数からn進数への変換:
- 整数部分の変換(割り算を利用)
- 小数部分の変換(掛け算を利用)
- 整数と小数を含む場合の変換
- n進数から10進数への変換:
- 位取りの重みを利用
- 小数部分を含む場合の変換
- n進数同士の変換:10進数を介さない方法(2進数、8進数、16進数)
- 2進数と8進数の変換
- 2進数と16進数の変換
- その他のn進数間の変換について
- なぜn進法が必要か?:コンピュータと社会での応用例
- よくある疑問と落とし穴:理解を深めるQ&A
- 練習問題:学んだ知識を試す
- まとめ:n進法変換マスターへの道
- 付録:覚えておきたいこと・用語集
1. はじめに:n進法とは何か? なぜ学ぶのか?
私たちは普段、数を数えたり、計算したりする際に「0, 1, 2, 3, 4, 5, 6, 7, 8, 9」という10個の数字を使って、数の大きさを表現しています。そして、数字が「9」の次に来たら、一つ上の位を増やして「10」と表現します。この、0から9までの10個の数字を使い、位が上がるごとに10倍になる仕組みを「10進法」と呼びます。
「n進法」とは、この「10」の部分が「n」になった、数の表現方法の一般的な呼び方です。つまり、n進法では、0から(n-1)までのn個の数字を使って数を表現します。そして、数字が(n-1)の次に来たら、一つ上の位を増やして表現します。位が上がるごとに、その位の値はn倍になります。
例えば、2進法であれば、使う数字は「0」と「1」の2つです。1の次に来たら位が上がって「10」(これは10進法の2を表します)となります。位が上がるごとに値は2倍になります。
8進法であれば、使う数字は「0」から「7」までの8つです。7の次に来たら位が上がって「10」(これは10進法の8を表します)となります。位が上がるごとに値は8倍になります。
16進法であれば、使う数字は「0」から「9」までの10個に加え、A, B, C, D, E, Fの6個のアルファベットを使い、合計16個で数を表現します。ここでAは10、Bは11、…、Fは15を表します。Fの次に来たら位が上がって「10」(これは10進法の16を表します)となります。位が上がるごとに値は16倍になります。
このように、n進法は、使う数字の種類と、位が上がるごとに何倍になるかが異なる、数の表現方法です。
では、なぜ私たちはn進法を学ぶ必要があるのでしょうか?
最も大きな理由は、「コンピュータがn進法、特に2進法で動いている」からです。現代のデジタルコンピュータは、電気信号のON/OFF(電流が流れているかいないか)を「1」と「0」に対応させて情報を処理しています。これはまさに2進法の世界です。私たちが普段使う10進数の情報をコンピュータが扱えるようにしたり、コンピュータが出力した2進数の情報を人間が理解できるようにしたりするためには、n進数と10進数の間の変換が必要不可欠になります。
また、プログラミングやデータ通信の分野では、8進法や16進法も頻繁に使われます。これらは、長い2進数の並びをより短く、人間に扱いやすい形で表現するために使われます。例えば、コンピュータのメモリ上のアドレスや、色を指定するカラーコード(例: #FFFFFF は白色)など、身近なところでも16進法が使われています。
n進法を理解し、変換方法をマスターすることは、現代の情報技術を理解する上で非常に重要な第一歩となります。さらに、数の表現方法の多様性を知ることで、数学的な柔軟な思考力を養うことにも繋がります。
この記事では、主に以下の3種類の変換方法に焦点を当てて解説します。
- 10進数 → n進数
- n進数 → 10進数
- n進数 → m進数 (特に2進数と8/16進数の間)
これらの変換方法を、具体的な計算手順と豊富な例を通して、初心者の方でも完全に理解できるように丁寧に解説していきます。
2. 10進法のおさらい:私たちが使う数の仕組み
n進法を理解するためには、まず私たちが普段当たり前のように使っている10進法が、どのような仕組みで成り立っているのかを改めて理解することが重要です。10進法は、位取り記数法という仕組みに基づいています。
位取り記数法とは、数字を並べる位置(位)によって、その数字が表す大きさが変わるという記数法です。
例えば、「123」という10進数を考えてみましょう。
この数字は、
- 一番右の「3」は「一の位」にあります。これは $3 \times 10^0$ を表します。
- 真ん中の「2」は「十の位」にあります。これは $2 \times 10^1$ を表します。
- 一番左の「1」は「百の位」にあります。これは $1 \times 10^2$ を表します。
したがって、「123」という数字は、これらの位の値の合計として表現されています。
$123 = 1 \times 100 + 2 \times 10 + 3 \times 1$
$123 = 1 \times 10^2 + 2 \times 10^1 + 3 \times 10^0$
このように、10進法では、基準となる数として「10」を使います。そして、位が右から左へ一つ移動するごとに、その位が表す値は10倍になります($10^0 \to 10^1 \to 10^2 \to \dots$)。逆に、左から右へ一つ移動するごとに、その位が表す値は1/10倍になります。
小数の場合も同じです。例えば、「123.45」という10進数を考えてみましょう。
- 小数点のすぐ右の「4」は「十分の一の位」にあります。これは $4 \times 10^{-1}$ を表します。
- その右の「5」は「百分の一の位」にあります。これは $5 \times 10^{-2}$ を表します。
したがって、「123.45」という数字は、
$123.45 = 1 \times 10^2 + 2 \times 10^1 + 3 \times 10^0 + 4 \times 10^{-1} + 5 \times 10^{-2}$
となります。
ここで重要なのは以下の点です。
- 基数(底): 10進法では「10」が基数です。位が上がるごとの倍率、そして使う数字の種類(0から9までの10個)を決定します。
- 位: 数字の位置によって、その値が基数の何乗に対応するかが決まります。小数点から左に $k$ 番目の位は $10^{k-1}$、小数点から右に $k$ 番目の位は $10^{-k}$ の重みを持ちます(0乗の位を小数点直前とする場合)。
- 数字: 各位に置かれる数字は、その位の重みを持つ単位がいくつあるかを示します。10進法では0から9までの10個の数字を使います。
この「基数」と「位取り」の考え方は、そのままn進法に応用できます。n進法は、この基数が10以外の整数になっただけなのです。
3. n進法の基本原理:位取りと基数
さて、10進法の仕組みを理解したところで、いよいよn進法の基本原理に入りましょう。
n進法は、10進法と同様に「位取り記数法」です。ただし、基数(底)が10ではなく、任意の整数 $n$ ($n > 1$) になります。
n進法では、以下の特徴があります。
- 基数(底): $n$ が基数です。位が上がるごとの倍率は $n$ 倍になります。
- 使う数字: 0から $(n-1)$ までの $n$ 個の数字を使います。例えば、2進法なら0と1、8進法なら0から7、16進法なら0から9とAからF(A=10, …, F=15)を使います。
- 位: 10進法と同様に、数字の位置によって位が決まります。小数点から左に $k$ 番目の位は $n^{k-1}$、小数点から右に $k$ 番目の位は $n^{-k}$ の重み(位の値)を持ちます(0乗の位を小数点直前とする場合)。
あるn進数 $(a_m a_{m-1} \dots a_1 a_0 . b_1 b_2 \dots b_p)_n$ は、10進数に変換すると以下の値になります。
$(a_m a_{m-1} \dots a_1 a_0 . b_1 b_2 \dots b_p)n = a_m \times n^m + a{m-1} \times n^{m-1} + \dots + a_1 \times n^1 + a_0 \times n^0 + b_1 \times n^{-1} + b_2 \times n^{-2} + \dots + b_p \times n^{-p}$
ここで、$a_i$ および $b_j$ は0から $(n-1)$ までの数字(または16進数の場合はA-F)です。下付きの $n$ は、その数がn進数であることを示します。10進数の場合は下付きの10を省略することが多いですが、混乱を避けるために敢えて $( \quad )_{10}$ と書くこともあります。
具体例で見てみましょう:
-
2進数 $(1101)_2$
- 右から順に位を見ると、 $2^0$ の位に1、$2^1$ の位に0、$2^2$ の位に1、$2^3$ の位に1があります。
- 10進数に変換すると: $1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 = 1 \times 8 + 1 \times 4 + 0 \times 2 + 1 \times 1 = 8 + 4 + 0 + 1 = 13_{10}$
- したがって、$(1101)2 = 13{10}$ です。
-
8進数 $(37)_8$
- 右から順に位を見ると、 $8^0$ の位に7、$8^1$ の位に3があります。
- 10進数に変換すると: $3 \times 8^1 + 7 \times 8^0 = 3 \times 8 + 7 \times 1 = 24 + 7 = 31_{10}$
- したがって、$(37)8 = 31{10}$ です。
-
16進数 $(2A)_ {16}$
- 右から順に位を見ると、 $16^0$ の位にA(これは10進数の10)、$16^1$ の位に2があります。
- 10進数に変換すると: $2 \times 16^1 + A \times 16^0 = 2 \times 16 + 10 \times 1 = 32 + 10 = 42_{10}$
- したがって、$(2A){16} = 42{10}$ です。
この位取りの考え方を使って、n進数から10進数への変換は簡単に行えます。これは後ほど詳しく解説します。
では、次のセクションからはいよいよ、最もよく使われる変換方法について、計算手順を追って詳しく見ていきましょう。
4. 10進数からn進数への変換
10進数を他のn進数に変換する方法は、整数部分と小数部分で異なります。それぞれ見ていきましょう。
4.1. 整数部分の変換(割り算を利用)
10進数の整数をn進数に変換するには、「nで繰り返し割り算を行い、その余りを下から順に並べる」という方法を用います。
なぜこの方法で変換できるのでしょうか?
10進数 $N$ をn進数で $(a_m a_{m-1} \dots a_1 a_0)_n$ と表したとします。これは、
$N = a_m n^m + a_{m-1} n^{m-1} + \dots + a_1 n^1 + a_0 n^0$
と書けますね。この式の右辺を $n$ で割ってみましょう。
$N \div n = (a_m n^m + \dots + a_1 n^1 + a_0) \div n$
$N \div n = (a_m n^{m-1} + \dots + a_1 n^0) \text{ 余り } a_0$
そうです、$N$ を $n$ で割った余りは $a_0$、つまりn進数の一番右(一番下の位、$n^0$ の位)の数字になります。
次に、割り算の結果得られた商を再び $n$ で割ります。
$(a_m n^{m-1} + \dots + a_1) \div n = (a_m n^{m-2} + \dots + a_2 n^0) \text{ 余り } a_1$
今度は余りが $a_1$、つまりn進数の右から2番目の位($n^1$ の位)の数字になりました。
この操作を、商が0になるまで繰り返すと、余りが下から順に $a_0, a_1, \dots, a_m$ と求められます。これらを下から(最後に出た余りから)順に並べれば、n進数が得られるのです。
計算手順:
- 変換したい10進数の整数を、目的のn進法の基数 $n$ で割ります。
- その商と余りを求めます。
- 得られた商を、再び基数 $n$ で割ります。
- この操作(商を基数 $n$ で割り、商と余りを求める)を、商が0になるまで繰り返します。
- 最後に求めた余りから順に(下から上へ)並べると、n進数の整数部分が得られます。
具体例 1: 10進数 13 を 2進数に変換
目的のn進法は2進法なので、基数 $n=2$ で割っていきます。
- $13 \div 2 = 6$ 余り 1
- $6 \div 2 = 3$ 余り 0
- $3 \div 2 = 1$ 余り 1
- $1 \div 2 = 0$ 余り 1 (商が0になったので終了)
最後に求めた余りから下から上へ並べます。
余りは下から順に 1, 1, 0, 1 です。
したがって、13 を2進数に変換すると $(1101)_2$ となります。
確認: $(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: 10進数 100 を 8進数に変換
目的のn進法は8進法なので、基数 $n=8$ で割っていきます。
- $100 \div 8 = 12$ 余り 4
- $12 \div 8 = 1$ 余り 4
- $1 \div 8 = 0$ 余り 1 (商が0になったので終了)
最後に求めた余りから下から上へ並べます。
余りは下から順に 1, 4, 4 です。
したがって、100 を8進数に変換すると $(144)_8$ となります。
確認: $(144)8 = 1 \times 8^2 + 4 \times 8^1 + 4 \times 8^0 = 1 \times 64 + 4 \times 8 + 4 \times 1 = 64 + 32 + 4 = 100{10}$。合っていますね。
具体例 3: 10進数 255 を 16進数に変換
目的のn進法は16進法なので、基数 $n=16$ で割っていきます。16進数では、10以上15以下の余りはアルファベットで表記します (10=A, 11=B, 12=C, 13=D, 14=E, 15=F)。
- $255 \div 16 = 15$ 余り 15 (F)
- $15 \div 16 = 0$ 余り 15 (F) (商が0になったので終了)
最後に求めた余りから下から上へ並べます。
余りは下から順に F, F です。
したがって、255 を16進数に変換すると $(FF)_{16}$ となります。
確認: $(FF){16} = F \times 16^1 + F \times 16^0 = 15 \times 16 + 15 \times 1 = 240 + 15 = 255{10}$。合っていますね。
この繰り返し割り算の方法は、どんな基数 $n$ のn進数への変換にも使えます。コンピュータの世界でよく使われる2進数、8進数、16進数への変換はもちろん、3進数や5進数など、任意の整数基数への変換に応用可能です。
4.2. 小数部分の変換(掛け算を利用)
10進数の小数をn進数に変換するには、「小数部分にnを繰り返し掛け、その都度できる整数部分を上から順に並べる」という方法を用います。
なぜこの方法で変換できるのでしょうか?
10進数の小数 $M$ をn進数で $(0.b_1 b_2 b_3 \dots)_n$ と表したとします。これは、
$M = b_1 n^{-1} + b_2 n^{-2} + b_3 n^{-3} + \dots$
と書けますね。この式の両辺に $n$ を掛けてみましょう。
$M \times n = (b_1 n^{-1} + b_2 n^{-2} + b_3 n^{-3} + \dots) \times n$
$M \times n = b_1 n^0 + b_2 n^{-1} + b_3 n^{-2} + \dots$
$M \times n = b_1 . b_2 b_3 \dots$
そうです、$M$ に $n$ を掛けた結果の整数部分が $b_1$、つまりn進数の小数第一位の数字になります。小数点以下の部分は $b_2 n^{-1} + b_3 n^{-2} + \dots$ となります。
次に、得られた小数点以下の部分に再び $n$ を掛けます。
$(b_2 n^{-1} + b_3 n^{-2} + \dots) \times n = b_2 n^0 + b_3 n^{-1} + \dots$
$(b_2 n^{-1} + b_3 n^{-2} + \dots) \times n = b_2 . b_3 \dots$
今度は整数部分が $b_2$、つまりn進数の小数第二位の数字になりました。
この操作を、小数部分が0になるか、必要な桁数になるまで繰り返すと、整数部分が上から順に $b_1, b_2, b_3, \dots$ と求められます。これらを小数点以下に順に並べれば、n進数の小数部分が得られるのです。
ただし、注意点として、10進数で有限小数であっても、他のn進数では無限小数になる場合があります。この場合、必要な桁数まで計算を繰り返すか、循環するパターンが見つかるまで計算を行います。
計算手順:
- 変換したい10進数の小数部分を、目的のn進法の基数 $n$ で掛けます。
- その結果の整数部分を求めます。これがn進数の小数第一位の数字になります。
- 得られた結果の小数部分を、再び基数 $n$ で掛けます。
- その結果の整数部分を求めます。これがn進数の小数第二位の数字になります。
- この操作(小数部分に基数 $n$ を掛け、整数部分を取り出す)を、小数部分が0になるか、必要な桁数まで繰り返します。
- 求めた整数部分を上から順に(最初に出た整数部分から)並べると、n進数の小数部分が得られます。
具体例 1: 10進数 0.375 を 2進数に変換
目的のn進法は2進法なので、基数 $n=2$ で掛けていきます。
- $0.375 \times 2 = 0.75$ 整数部分: 0
- $0.75 \times 2 = 1.5$ 整数部分: 1
- $0.5 \times 2 = 1.0$ 整数部分: 1 (小数部分が0になったので終了)
求めた整数部分を上から下へ並べます。
整数部分は上から順に 0, 1, 1 です。
したがって、0.375 を2進数に変換すると $(0.011)_2$ となります。
確認: $(0.011)2 = 0 \times 2^{-1} + 1 \times 2^{-2} + 1 \times 2^{-3} = 0 \times 0.5 + 1 \times 0.25 + 1 \times 0.125 = 0 + 0.25 + 0.125 = 0.375{10}$。合っていますね。
具体例 2: 10進数 0.7 を 2進数に変換
基数 $n=2$ で掛けていきます。
- $0.7 \times 2 = 1.4$ 整数部分: 1
- $0.4 \times 2 = 0.8$ 整数部分: 0
- $0.8 \times 2 = 1.6$ 整数部分: 1
- $0.6 \times 2 = 1.2$ 整数部分: 1
- $0.2 \times 2 = 0.4$ 整数部分: 0
- $0.4 \times 2 = 0.8$ 整数部分: 1
…以下、小数部分が 0.4, 0.8, 0.6, 0.2 の繰り返しになります。
求めた整数部分を上から下へ並べます。
整数部分は上から順に 1, 0, 1, 1, 0, 1, … と続きます。
したがって、0.7 を2進数に変換すると $(0.10110110…)_2$ という無限小数になります。通常は必要な桁数で打ち切るか、循環するパターンが見つかるまで計算を行います。例えば、小数点以下6桁までなら $(0.101101)_2$ となります。
このように、10進数の有限小数が、他の進法では無限小数になることは珍しくありません。コンピュータで実数を扱う際に誤差が生じる原因の一つです。
具体例 3: 10進数 0.4 を 8進数に変換
基数 $n=8$ で掛けていきます。
- $0.4 \times 8 = 3.2$ 整数部分: 3
- $0.2 \times 8 = 1.6$ 整数部分: 1
- $0.6 \times 8 = 4.8$ 整数部分: 4
- $0.8 \times 8 = 6.4$ 整数部分: 6
- $0.4 \times 8 = 3.2$ 整数部分: 3
…以下、小数部分が 0.4, 0.2, 0.6, 0.8 の繰り返しになります。
求めた整数部分を上から下へ並べます。
整数部分は上から順に 3, 1, 4, 6, 3, 1, 4, 6, … と続きます。
したがって、0.4 を8進数に変換すると $(0.31463146…)_8$ という循環小数になります。小数点以下4桁までなら $(0.3146)_8$ となります。
4.3. 整数と小数を含む場合の変換
10進数が整数部分と小数部分の両方を含む場合(例: 13.375)、それぞれの部分を独立して変換し、最後に結合します。
計算手順:
- 10進数の整数部分を、上記「4.1. 整数部分の変換」の方法で目的のn進数に変換します。
- 10進数の小数部分を、上記「4.2. 小数部分の変換」の方法で目的のn進数に変換します。
- 変換した整数部分と小数部分を、小数点を挟んで結合します。
具体例: 10進数 13.375 を 2進数に変換
-
整数部分 13 を2進数に変換:
- $13 \div 2 = 6$ 余り 1
- $6 \div 2 = 3$ 余り 0
- $3 \div 2 = 1$ 余り 1
- $1 \div 2 = 0$ 余り 1
- 結果: $(1101)_2$
-
小数部分 0.375 を2進数に変換:
- $0.375 \times 2 = 1.5$ 整数部分: 0
- $0.75 \times 2 = 1.5$ 整数部分: 1 (前のステップの小数部分 0.75 を使う)
- $0.5 \times 2 = 1.0$ 整数部分: 1 (前のステップの小数部分 0.5 を使う)
- 結果: $(0.011)_2$
-
結合:
整数部分 $(1101)_2$ と小数部分 $(0.011)_2$ を結合して $(1101.011)_2$ となります。
したがって、10進数 13.375 を2進数に変換すると $(1101.011)_2$ となります。
補足: 繰り返し割り算で整数部分の最下位桁($n^0$ の位)の余りが最初に出る理由、そして繰り返し掛け算で小数部分の最上位桁($n^{-1}$ の位)の整数部分が最初に出る理由を改めて考えてみましょう。
これは、変換したい数を $N$ とし、それをn進数で $(a_m \dots a_0 . b_1 \dots)_n$ と表したときに
$N = a_m n^m + \dots + a_1 n^1 + a_0 n^0 + b_1 n^{-1} + b_2 n^{-2} + \dots$
という展開ができるからです。
整数部分 $I = a_m n^m + \dots + a_1 n^1 + a_0$ を $n$ で割ると、$a_0$ 以外の項は全て $n$ の倍数なので、余りは $a_0$ になります。商は $a_m n^{m-1} + \dots + a_1$ となり、これを再び $n$ で割ると余りは $a_1$ になります。このプロセスが繰り返し割り算の原理です。
小数部分 $F = b_1 n^{-1} + b_2 n^{-2} + \dots$ に $n$ を掛けると $F \times n = b_1 + b_2 n^{-1} + b_3 n^{-2} + \dots$ となり、整数部分は $b_1$ になります。残った小数部分 $b_2 n^{-1} + b_3 n^{-2} + \dots$ に再び $n$ を掛けると整数部分は $b_2$ になります。このプロセスが繰り返し掛け算の原理です。
原理を理解すると、計算手順がより納得できるでしょう。
5. n進数から10進数への変換
他のn進数を10進数に変換する方法は、既に「3. n進法の基本原理」で触れた位取りの考え方を利用します。これは10進法のおさらいで見た式を一般化したものです。
計算手順:
- 変換したいn進数の各桁の数字に、その桁の位に対応する基数 $n$ のべき乗を掛けます。
- 小数点から左に $k$ 番目の桁は $n^{k-1}$ を掛けます(小数点直前が $n^0$)。
- 小数点から右に $k$ 番目の桁は $n^{-k}$ を掛けます。
- それぞれの桁で求めた値をすべて合計します。
具体例 1: 2進数 $(10101)_2$ を 10進数に変換
基数 $n=2$ です。小数点はありません(小数点は一番右にあると考える)。
右から左へ、位の重みは $2^0, 2^1, 2^2, 2^3, 2^4 \dots$ となります。
- 一番右の桁「1」: $1 \times 2^0 = 1 \times 1 = 1$
- 右から2番目の桁「0」: $0 \times 2^1 = 0 \times 2 = 0$
- 右から3番目の桁「1」: $1 \times 2^2 = 1 \times 4 = 4$
- 右から4番目の桁「0」: $0 \times 2^3 = 0 \times 8 = 0$
- 右から5番目の桁「1」: $1 \times 2^4 = 1 \times 16 = 16$
これらの値をすべて合計します。
$1 + 0 + 4 + 0 + 16 = 21$
したがって、$(10101)2 = 21{10}$ です。
具体例 2: 8進数 $(52)_8$ を 10進数に変換
基数 $n=8$ です。小数点はありません。
右から左へ、位の重みは $8^0, 8^1, 8^2, \dots$ となります。
- 一番右の桁「2」: $2 \times 8^0 = 2 \times 1 = 2$
- 右から2番目の桁「5」: $5 \times 8^1 = 5 \times 8 = 40$
これらの値をすべて合計します。
$2 + 40 = 42$
したがって、$(52)8 = 42{10}$ です。
具体例 3: 16進数 $(3D)_{16}$ を 10進数に変換
基数 $n=16$ です。小数点はありません。16進数の数字 D は10進数の13です。
右から左へ、位の重みは $16^0, 16^1, 16^2, \dots$ となります。
- 一番右の桁「D」: $D \times 16^0 = 13 \times 1 = 13$
- 右から2番目の桁「3」: $3 \times 16^1 = 3 \times 16 = 48$
これらの値をすべて合計します。
$13 + 48 = 61$
したがって、$(3D){16} = 61{10}$ です。
5.1. 小数部分を含む場合の変換
小数部分を含むn進数を10進数に変換する場合も、基本は同じ位取りの考え方を使います。小数点以下の桁は、基数 $n$ の負のべき乗を掛けます。
計算手順:
- 整数部分と小数部分に分けます。
- 整数部分の各桁に、対応する位の基数 $n$ の非負のべき乗を掛け、合計します。
- 小数部分の各桁に、対応する位の基数 $n$ の負のべき乗を掛け、合計します。
- 小数第一位は $n^{-1}$、小数第二位は $n^{-2}$、… を掛けます。
- 整数部分と小数部分の合計値を合わせます。
具体例: 2進数 $(1101.011)_2$ を 10進数に変換
基数 $n=2$ です。
整数部分 $(1101)_2$:
* $1 \times 2^3 = 8$
* $1 \times 2^2 = 4$
* $0 \times 2^1 = 0$
* $1 \times 2^0 = 1$
合計: $8 + 4 + 0 + 1 = 13$
小数部分 $(0.011)_2$:
* 小数第一位「0」: $0 \times 2^{-1} = 0 \times 0.5 = 0$
* 小数第二位「1」: $1 \times 2^{-2} = 1 \times 0.25 = 0.25$
* 小数第三位「1」: $1 \times 2^{-3} = 1 \times 0.125 = 0.125$
合計: $0 + 0.25 + 0.125 = 0.375$
結合:
整数部分の合計 13 と小数部分の合計 0.375 を合わせて $13 + 0.375 = 13.375$ となります。
したがって、$(1101.011)2 = 13.375{10}$ です。
このn進数から10進数への変換は、原理が比較的単純で分かりやすいかと思います。各桁の数字が、基数の何乗の位に対応しているのかを正確に把握することが重要です。
6. n進数同士の変換:10進数を介さない方法(2進数、8進数、16進数)
一般的に、あるn進数を別のm進数に変換する場合、一度10進数に変換してから、目的のm進数に変換するのが最も確実な方法です。
例えば、8進数 $(37)8$ を2進数に変換したい場合、
1. 8進数 $(37)_8$ を10進数に変換: $3 \times 8^1 + 7 \times 8^0 = 24 + 7 = 31{10}$
2. 10進数 $31$ を2進数に変換:
$31 \div 2 = 15$ 余り 1
$15 \div 2 = 7$ 余り 1
$7 \div 2 = 3$ 余り 1
$3 \div 2 = 1$ 余り 1
$1 \div 2 = 0$ 余り 1
余りを下から並べて $(11111)_2$
したがって、$(37)_8 = (11111)_2$ となります。
しかし、特定のn進数とm進数の間には、10進数を介さずに直接変換できる、もっと簡単な方法が存在します。特に、コンピュータの世界でよく使われる2進数、8進数、16進数の間では、この直接変換が非常に便利です。
この便利な変換が可能となるのは、8進法の基数 8 が $2^3$ であり、16進法の基数 16 が $2^4$ であるという関係があるからです。
6.1. 2進数と8進数の変換
-
2進数 → 8進数: 2進数の数字を、小数点を基準に3桁ずつグループ化します。各グループが表す値を8進数の1桁に対応させます。
- 小数点の左側の整数部分は、右から3桁ずつグループ化します。最後のグループが3桁に満たない場合は、左側に0を補って3桁にします。
- 小数点の右側の小数部分は、左から3桁ずつグループ化します。最後のグループが3桁に満たない場合は、右側に0を補って3桁にします。
- 各3桁の2進数を、それが表す10進数(0から7の範囲)に変換します。その10進数がそのまま8進数の1桁になります。
計算手順:
1. 2進数の整数部分を右から3桁ずつ、小数部分を左から3桁ずつグループ化します。
2. 桁が足りないグループには、整数部分の左に、小数部分の右に0を補って3桁にします。
3. 各3桁の2進数グループを、対応する1桁の8進数(0-7)に変換します。
4. 各グループの8進数を並べて完成です。具体例: 2進数 $(1101011.1011)_2$ を 8進数に変換
整数部分: $1101011_2$
右から3桁ずつグループ化: $1 | 101 | 011$
左端が1桁なので0を補って3桁に: $001 | 101 | 011$
各グループを8進数に変換:
$(001)2 = 0 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 = 1{10} = 1_8$
$(101)2 = 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 = 4 + 0 + 1 = 5{10} = 5_8$
$(011)2 = 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 = 0 + 2 + 1 = 3{10} = 3_8$
整数部分は $(153)_8$ となります。小数部分: $0.1011_2$
左から3桁ずつグループ化: $101 | 1$
右端が1桁なので0を補って3桁に: $101 | 100$
各グループを8進数に変換:
$(101)2 = 5{10} = 5_8$
$(100)2 = 1 \times 2^2 + 0 \times 2^1 + 0 \times 2^0 = 4 + 0 + 0 = 4{10} = 4_8$
小数部分は $(0.54)_8$ となります。結合して、$(1101011.1011)_2 = (153.54)_8$ となります。
-
8進数 → 2進数: 8進数の各桁の数字を、対応する3桁の2進数に置き換えます。
計算手順:
1. 8進数の各桁の数字(0-7)を、それぞれ3桁の2進数に変換します。
2. これらの3桁の2進数を、元の桁順に並べて完成です。
3. 変換後、整数部分の左端の0や、小数部分の右端の0は省略しても構いません。具体例: 8進数 $(62.4)_8$ を 2進数に変換
各桁を3桁の2進数に変換します。
$6_8 = (110)_2$
$2_8 = (010)_2$
$4_8 = (100)_2$これらを桁順に並べます。
整数部分の6は110、2は010 なので $(110010)_2$
小数部分の4は100 なので $(0.100)_2$結合して $(110010.100)_2$ となります。
整数部分の左端に0がないため省略は不要です。小数部分の右端の0は省略しても構いませんが、通常はこのまま表記します。したがって、$(62.4)_8 = (110010.100)_2$ です。
6.2. 2進数と16進数の変換
-
2進数 → 16進数: 2進数の数字を、小数点を基準に4桁ずつグループ化します。各グループが表す値を16進数の1桁に対応させます。
- 小数点の左側の整数部分は、右から4桁ずつグループ化します。最後のグループが4桁に満たない場合は、左側に0を補って4桁にします。
- 小数点の右側の小数部分は、左から4桁ずつグループ化します。最後のグループが4桁に満たない場合は、右側に0を補って4桁にします。
- 各4桁の2進数を、それが表す10進数(0から15の範囲)に変換し、対応する16進数の1桁(0-9, A-F)に置き換えます。
計算手順:
1. 2進数の整数部分を右から4桁ずつ、小数部分を左から4桁ずつグループ化します。
2. 桁が足りないグループには、整数部分の左に、小数部分の右に0を補って4桁にします。
3. 各4桁の2進数グループを、対応する1桁の16進数(0-9, A-F)に変換します。
4. 各グループの16進数を並べて完成です。具体例: 2進数 $(1101011101.10111)_2$ を 16進数に変換
整数部分: $1101011101_2$
右から4桁ずつグループ化: $11 | 0101 | 1101$
左端が2桁なので0を補って4桁に: $0011 | 0101 | 1101$
各グループを16進数に変換:
$(0011)2 = 0 \times 8 + 0 \times 4 + 1 \times 2 + 1 \times 1 = 3{10} = 3_{16}$
$(0101)2 = 0 \times 8 + 1 \times 4 + 0 \times 2 + 1 \times 1 = 4 + 1 = 5{10} = 5_{16}$
$(1101)2 = 1 \times 8 + 1 \times 4 + 0 \times 2 + 1 \times 1 = 8 + 4 + 1 = 13{10} = D_{16}$
整数部分は $(35D)_{16}$ となります。小数部分: $0.10111_2$
左から4桁ずつグループ化: $1011 | 1$
右端が1桁なので0を補って4桁に: $1011 | 1000$
各グループを16進数に変換:
$(1011)2 = 1 \times 8 + 0 \times 4 + 1 \times 2 + 1 \times 1 = 8 + 2 + 1 = 11{10} = B_{16}$
$(1000)2 = 1 \times 8 + 0 \times 4 + 0 \times 2 + 0 \times 1 = 8{10} = 8_{16}$
小数部分は $(0.B8)_{16}$ となります。結合して、$(1101011101.10111)2 = (35D.B8){16}$ となります。
-
16進数 → 2進数: 16進数の各桁の数字を、対応する4桁の2進数に置き換えます。
計算手順:
1. 16進数の各桁の数字(0-9, A-F)を、それぞれ4桁の2進数に変換します。16進数のアルファベットは対応する10進数に直してから2進数にします(A=10, …, F=15)。
2. これらの4桁の2進数を、元の桁順に並べて完成です。
3. 変換後、整数部分の左端の0や、小数部分の右端の0は省略しても構いません。具体例: 16進数 $(9F.C)_{16}$ を 2進数に変換
各桁を4桁の2進数に変換します。
$9_{16} = 9_{10} = (1001)2$
$F{16} = 15_{10} = (1111)2$
$C{16} = 12_{10} = (1100)_2$これらを桁順に並べます。
整数部分の9は1001、Fは1111 なので $(10011111)_2$
小数部分のCは1100 なので $(0.1100)_2$結合して $(10011111.1100)_2$ となります。
整数部分の左端に0がないため省略は不要です。小数部分の右端の0は省略しても構いませんが、通常はこのまま表記します。したがって、$(9F.C)_{16} = (10011111.1100)_2$ です。
なぜこの直接変換が可能なのか?
これは、基数 $m$ が基数 $n$ のべき乗、つまり $m = n^k$ ($k$ は整数)の関係にある場合に成り立ちます。
この関係があれば、$m$ 進数の1桁は、ちょうど $k$ 桁の $n$ 進数で表現できます。
- 8進数(基数8)は 2進数(基数2)の3乗 ($8=2^3$) なので、8進数の1桁は2進数の3桁に対応します。
- 16進数(基数16)は 2進数(基数2)の4乗 ($16=2^4$) なので、16進数の1桁は2進数の4桁に対応します。
この対応関係を利用することで、10進数を介することなく、2進数、8進数、16進数の間で効率的に変換を行うことができるのです。
6.3. その他のn進数間の変換について
2進数と8進数・16進数以外のn進数同士を変換する場合は、特別な関係がない限り、通常は一度10進数を介する方法で行います。
例えば、5進数 $(34)5$ を3進数に変換したい場合:
1. 5進数 $(34)_5$ を10進数に変換: $3 \times 5^1 + 4 \times 5^0 = 15 + 4 = 19{10}$
2. 10進数 $19$ を3進数に変換:
$19 \div 3 = 6$ 余り 1
$6 \div 3 = 2$ 余り 0
$2 \div 3 = 0$ 余り 2
余りを下から並べて $(201)_3$
したがって、$(34)_5 = (201)_3$ となります。
このように、特殊な関係がない場合は、一度10進数に戻すのが最も一般的な変換方法です。
7. なぜn進法が必要か?:コンピュータと社会での応用例
n進法の概念は、単なる数学の面白い話題にとどまらず、私たちの現代社会において非常に重要な役割を果たしています。その最たるものが、コンピュータです。
コンピュータと2進法:
現代のデジタルコンピュータは、電気信号のON/OFFや、磁気のS極/N極といった、2つの状態を区別することで情報を処理しています。これを「0」と「1」に対応させたものが2進法です。コンピュータの内部では、すべてのデータ(文字、画像、音声、プログラムなど)や計算が、この2進数の羅列として扱われています。
私たちがキーボードから文字を入力したり、画面に表示される情報を見たり、プログラムを実行したりできるのは、コンピュータの内部で行われる2進数処理と、人間が理解できる10進数や文字情報との間で、常に変換が行われているからです。
8進法・16進法の役割:
コンピュータは2進数で動きますが、2進数は桁数が非常に多くなりがちです。例えば、10進数の255は、2進数では $(11111111)_2)$ となり8桁が必要です。このような長い2進数の並びは、人間にとっては扱いにくく、間違いやすいです。
そこで、2進数をより短い桁数で表現するために、8進法や16進法が使われます。前述のように、8進数の1桁は2進数の3桁、16進数の1桁は2進数の4桁に対応するため、長い2進数を効率的に表現できます。
- 8進法: かつて、コンピュータの内部状態を人間が確認する際などに使われました。しかし、現代では16進数が主流になっています。
- 16進法: 現在、最も頻繁に使われるのが16進法です。
- メモリダンプ: プログラムがクラッシュした際などに、メモリの内容を16進数で表示することで、デバッグの手がかりとします。
- IPアドレス(IPv6): インターネット上の住所であるIPアドレスの新しい規格IPv6では、128ビットの長いアドレスを8つの16進数のグループで表現します(例: 2001:0db8:85a3:0000:0000:8a2e:0370:7334)。
- カラーコード: Webデザインや画像編集で色を指定する際に、R(赤)、G(緑)、B(青)の各色の強さを00からFFまでの16進数2桁で表現することがあります(例: #FF0000 は純粋な赤)。
- アセンブリ言語/機械語: コンピュータが直接理解する命令(機械語)や、それを人間が読めるようにしたアセンブリ言語は、16進数で表現されることが多いです。
このように、8進数や16進数は、2進数で表現されたコンピュータの情報を人間が効率的に扱いやすくするための「橋渡し」のような役割を果たしています。
その他のn進法の応用例:
- 3進法: 研究段階のコンピュータや、特定の論理回路で使用されることがあります。3つの状態(例: -1, 0, 1)を持つことで、理論上はより効率的な情報処理が可能になるという考え方があります。
- 60進法: これは古代バビロニアで使われていた記数法に由来し、現在でも時間の表現(60秒=1分, 60分=1時間)や角度の表現(360度=60×6)に残っています。
- 12進法: ダース(12個)という数え方や、時計の文字盤などで見られます。
n進法を学ぶことは、単に数字の変換ができるようになるだけでなく、私たちがどのように数を扱い、情報がどのように表現・処理されているのかという、より深い理解に繋がります。特にコンピュータサイエンスを学ぶ上で、n進法は避けて通れない基礎知識です。
8. よくある疑問と落とし穴:理解を深めるQ&A
n進法を学ぶ上で、多くの人が疑問に思ったり、混乱したりするポイントがいくつかあります。ここでは、そうしたよくある疑問に答える形で、さらに理解を深めましょう。
Q1: なぜ10進数からn進数への整数変換に「割り算」を使うのですか?
A1: これは「4.1. 整数部分の変換」の原理で解説しましたが、改めて別の角度から考えてみましょう。
10進数 $N$ をn進数で $(a_m a_{m-1} \dots a_1 a_0)_n$ と表すことは、$N = a_m n^m + \dots + a_1 n^1 + a_0 n^0$ と展開できることと同じです。
$a_0$ は $N$ を $n$ で割ったときの余りです。なぜなら、$a_1 n^1 + \dots + a_m n^m$ の部分はすべて $n$ の倍数であり、$a_0$ だけが $n$ で割り切れない(または割り切れる)からです。
例えば、13 を2進数にする場合:
$13 = (a_3 a_2 a_1 a_0)_2 = a_3 \times 2^3 + a_2 \times 2^2 + a_1 \times 2^1 + a_0 \times 2^0$
$13 = 2 \times (a_3 \times 2^2 + a_2 \times 2^1 + a_1) + a_0$
13 を 2 で割ると、商は $(a_3 \times 2^2 + a_2 \times 2^1 + a_1)$ で、余りは $a_0$ です。
この余り $a_0$ は、目的の2進数の一番下の桁($2^0$ の位)になります。
次に、得られた商 $(a_3 \times 2^2 + a_2 \times 2^1 + a_1)$ を再び 2 で割ると、同じ理屈で余りは $a_1$ になります。
これを繰り返すことで、$a_0, a_1, a_2, \dots$ が下から順に求められるため、繰り返し割り算が有効なのです。
Q2: なぜ10進数からn進数への小数変換に「掛け算」を使うのですか?
A2: これも「4.2. 小数部分の変換」の原理で解説しましたが、別の角度から。
10進数 $M$ をn進数の小数で $(0.b_1 b_2 b_3 \dots)_n$ と表すことは、$M = b_1 n^{-1} + b_2 n^{-2} + b_3 n^{-3} + \dots$ と展開できることと同じです。
$M$ に $n$ を掛けるとどうなるでしょう?
$M \times n = n \times (b_1 n^{-1} + b_2 n^{-2} + b_3 n^{-3} + \dots)$
$M \times n = b_1 n^0 + b_2 n^{-1} + b_3 n^{-2} + \dots$
$M \times n = b_1 + (b_2 n^{-1} + b_3 n^{-2} + \dots)$
この結果の整数部分は $b_1$ です。これは目的のn進数の小数第一位の数字です。
残った小数部分 $(b_2 n^{-1} + b_3 n^{-2} + \dots)$ に再び $n$ を掛けると、同じ理屈で整数部分は $b_2$ になります。
これを繰り返すことで、$b_1, b_2, b_3, \dots$ が上から順に求められるため、繰り返し掛け算が有効なのです。
Q3: 16進数でAからFを使うのはなぜですか?
A3: 16進法では、1桁で0から15までの16種類の値を表現する必要があります。10進数で使える数字は0から9までの10個だけです。10から15までの値を1桁で表現するために、追加の記号が必要になります。そこで、アルファベットのA, B, C, D, E, Fをそれぞれ10, 11, 12, 13, 14, 15に対応させて使用することになりました。これは単に慣習として定められたものです。
Q4: 2進数から8進数や16進数への変換で、グループ化する桁数が決まっているのはなぜですか?
A4: これは基数の関係 $8 = 2^3$ および $16 = 2^4$ から来ています。
2進数3桁で表現できる値の範囲は、$000_2$ から $111_2$ まで、つまり10進数の0から7までです。これはちょうど8進数1桁で表現できる値の範囲(0から7)と一致します。
2進数4桁で表現できる値の範囲は、$0000_2$ から $1111_2$ まで、つまり10進数の0から15までです。これはちょうど16進数1桁で表現できる値の範囲(0から15)と一致します。
この対応関係があるため、2進数を3桁ずつグループ化すれば8進数に、4桁ずつグループ化すれば16進数に簡単に変換できるのです。これは情報のブロックをより大きな単位でまとめる操作であり、コンピュータの世界でデータの表現を簡潔にするためによく利用されます。
Q5: 小数部分の変換で、計算がいつまでも終わらない場合はどうすれば良いですか?
A5: 10進数で有限小数であっても、他のn進数では無限小数、特に循環小数になることがあります(例: 10進数の0.1を2進数に変換すると無限小数になります)。
計算がいつまでも終わらない場合は、以下のいずれかの方法をとります。
* 必要な桁数まで計算して打ち切る: 例えば「小数点以下○桁まで求めよ」といった指示があれば、その桁数まで計算して終了します。
* 循環部分を見つけて表記する: 計算の途中で同じ小数部分が再び現れた場合、そこから先が循環することが分かります。循環する部分に印(例: .101101… や.$\dot{1}01\ddot{1}$) をつけて表記します。ただし、手計算で循環を見つけるのは根気がいる場合もあります。
コンピュータ内部では、通常は定められたビット数(桁数)で表現されるため、無限小数は正確には表現できず、誤差が生じます。
Q6: n進数の計算(足し算、引き算、掛け算など)はどうやるのですか?
A6: n進数の計算も、10進数の計算と基本的な原理は同じです。各桁の和や積を求め、その結果が基数 $n$ 以上になったら、上の位に繰り上げ(または繰り下がり)を行います。
例えば、2進数の足し算 $(1011)_2 + (110)_2$:
“`
1011 (11)
+ 0110 (6)
“`
1の位: $1 + 0 = 1$
2の位: $1 + 1 = 2$。2進数では2は $(10)_2$ なので、0を書いて1つ上の位に1を繰り上げる。
4の位: $0 + 1$ (元の桁の和) $+ 1$ (繰り上がってきた1) $= 2$。2進数では $(10)_2$ なので、0を書いて1つ上の位に1を繰り上げる。
8の位: $1$ (元の桁) $+ 0$ (元の桁) $+ 1$ (繰り上がってきた1) $= 2$。2進数では $(10)_2$ なので、0を書いて1つ上の位に1を繰り上げる。
16の位: 繰り上がってきた1のみ。
結果: $(10001)2$
10進数で確認: $11 + 6 = 17$。 $(10001)_2 = 1 \times 2^4 + 0 \times 2^3 + 0 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 = 16 + 1 = 17{10}$。合っていますね。
n進数の計算は、慣れれば10進数と同様に行えますが、この記事では変換方法に焦点を当てているため、詳しい計算方法は割愛しました。変換方法をしっかり理解すれば、計算も応用として学ぶことができるでしょう。
9. 練習問題:学んだ知識を試す
ここまでで、n進数の変換方法について詳しく学んできました。実際に手を動かして問題を解くことで、理解度を確かめ、知識を定着させましょう。
以下の問題を解いてみてください。解答はこのセクションの最後に記載しています。
問題 1: 10進数からn進数へ変換
(1) 10進数 25 を 2進数に変換しなさい。
(2) 10進数 78 を 8進数に変換しなさい。
(3) 10進数 171 を 16進数に変換しなさい。
(4) 10進数 0.8125 を 2進数に変換しなさい。
(5) 10進数 0.6 を 5進数に変換しなさい(小数第4位まで求めよ)。
(6) 10進数 59.625 を 2進数に変換しなさい。
問題 2: n進数から10進数へ変換
(1) 2進数 $(10101)2$ を 10進数に変換しなさい。
(2) 8進数 $(52)_8$ を 10進数に変換しなさい。
(3) 16進数 $(3D){16}$ を 10進数に変換しなさい。
(4) 2進数 $(10.101)_2$ を 10進数に変換しなさい。
(5) 8進数 $(7.04)_8$ を 10進数に変換しなさい。
問題 3: n進数同士の変換(10進数を介さない方法)
(1) 2進数 $(11010010)2$ を 8進数に変換しなさい。
(2) 2進数 $(1011101.01101)_2$ を 8進数に変換しなさい。
(3) 2進数 $(1110101100)_2$ を 16進数に変換しなさい。
(4) 2進数 $(1001110.110111)_2$ を 16進数に変換しなさい。
(5) 8進数 $(74)_8$ を 2進数に変換しなさい。
(6) 16進数 $(A5){16}$ を 2進数に変換しなさい。
解答:
問題 1:
(1) 25を2で割る:
$25 \div 2 = 12$ 余り 1
$12 \div 2 = 6$ 余り 0
$6 \div 2 = 3$ 余り 0
$3 \div 2 = 1$ 余り 1
$1 \div 2 = 0$ 余り 1
下から並べて: $(11001)_2$
(答) $(11001)_2$
(2) 78を8で割る:
$78 \div 8 = 9$ 余り 6
$9 \div 8 = 1$ 余り 1
$1 \div 8 = 0$ 余り 1
下から並べて: $(116)_8$
(答) $(116)_8$
(3) 171を16で割る:
$171 \div 16 = 10$ 余り 11 (B)
$10 \div 16 = 0$ 余り 10 (A)
下から並べて: $(AB)_{16}$
(答) $(AB)_{16}$
(4) 0.8125を2で掛ける:
$0.8125 \times 2 = 1.625$ (整数部分: 1)
$0.625 \times 2 = 1.25$ (整数部分: 1)
$0.25 \times 2 = 0.5$ (整数部分: 0)
$0.5 \times 2 = 1.0$ (整数部分: 1) (小数部分が0になった)
上から並べて: $(0.1101)_2$
(答) $(0.1101)_2$
(5) 0.6を5で掛ける:
$0.6 \times 5 = 3.0$ (整数部分: 3)
$0.0 \times 5 = 0.0$ (整数部分: 0) (小数部分が0になった)
上から並べて: $(0.3000)_5$
※ この例では小数部分がすぐに0になりましたが、無限小数になる場合もあります。この場合は小数第4位までなので、計算結果をそのまま並べます。
(答) $(0.3000)_5$
(6) 整数部分59を2進数に変換:
$59 \div 2 = 29$ 余り 1
$29 \div 2 = 14$ 余り 1
$14 \div 2 = 7$ 余り 0
$7 \div 2 = 3$ 余り 1
$3 \div 2 = 1$ 余り 1
$1 \div 2 = 0$ 余り 1
整数部分: $(111011)_2$
小数部分0.625を2進数に変換:
$0.625 \times 2 = 1.25$ (整数部分: 1)
$0.25 \times 2 = 0.5$ (整数部分: 0)
$0.5 \times 2 = 1.0$ (整数部分: 1) (小数部分が0になった)
小数部分: $(0.101)_2$
結合して: $(111011.101)_2$
(答) $(111011.101)_2$
問題 2:
(1) 2進数 $(10101)2$:
$1 \times 2^4 + 0 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 = 16 + 0 + 4 + 0 + 1 = 21{10}$
(答) $21_{10}$
(2) 8進数 $(52)8$:
$5 \times 8^1 + 2 \times 8^0 = 5 \times 8 + 2 \times 1 = 40 + 2 = 42{10}$
(答) $42_{10}$
(3) 16進数 $(3D){16}$ (Dは10進数で13):
$3 \times 16^1 + D \times 16^0 = 3 \times 16 + 13 \times 1 = 48 + 13 = 61{10}$
(答) $61_{10}$
(4) 2進数 $(10.101)2$:
整数部分 $(10)_2$: $1 \times 2^1 + 0 \times 2^0 = 2 + 0 = 2{10}$
小数部分 $(0.101)2$: $1 \times 2^{-1} + 0 \times 2^{-2} + 1 \times 2^{-3} = 1 \times 0.5 + 0 \times 0.25 + 1 \times 0.125 = 0.5 + 0 + 0.125 = 0.625{10}$
結合して: $2 + 0.625 = 2.625_{10}$
(答) $2.625_{10}$
(5) 8進数 $(7.04)8$:
整数部分 $(7)_8$: $7 \times 8^0 = 7 \times 1 = 7{10}$
小数部分 $(0.04)8$: $0 \times 8^{-1} + 4 \times 8^{-2} = 0 \times (1/8) + 4 \times (1/64) = 0 + 4/64 = 1/16 = 0.0625{10}$
結合して: $7 + 0.0625 = 7.0625_{10}$
(答) $7.0625_{10}$
問題 3:
(1) 2進数 $(11010010)_2$ を 8進数に変換:
整数部分を右から3桁ずつグループ化: $11 | 010 | 010$
左端に0を補って3桁に: $011 | 010 | 010$
各グループを8進数に変換: $011_2 = 3_8$, $010_2 = 2_8$, $010_2 = 2_8$
結合して: $(322)_8$
(答) $(322)_8$
(2) 2進数 $(1011101.01101)_2$ を 8進数に変換:
整数部分を右から3桁ずつグループ化: $1 | 011 | 101$ → $001 | 011 | 101$
各グループを8進数に変換: $001_2=1_8, 011_2=3_8, 101_2=5_8$
整数部分: $(135)_8$
小数部分を左から3桁ずつグループ化: $011 | 01$ → $011 | 010$
各グループを8進数に変換: $011_2=3_8, 010_2=2_8$
小数部分: $(0.32)_8$
結合して: $(135.32)_8$
(答) $(135.32)_8$
(3) 2進数 $(1110101100)2$ を 16進数に変換:
整数部分を右から4桁ずつグループ化: $11 | 1010 | 1100$
左端に0を補って4桁に: $0011 | 1010 | 1100$
各グループを16進数に変換: $0011_2=3{16}, 1010_2=10_{10}=A_{16}, 1100_2=12_{10}=C_{16}$
結合して: $(3AC)_{16}$
(答) $(3AC)_{16}$
(4) 2進数 $(1001110.110111)2$ を 16進数に変換:
整数部分を右から4桁ずつグループ化: $100 | 1110$ → $0100 | 1110$
各グループを16進数に変換: $0100_2=4{16}, 1110_2=14_{10}=E_{16}$
整数部分: $(4E){16}$
小数部分を左から4桁ずつグループ化: $1101 | 11$ → $1101 | 1100$
各グループを16進数に変換: $1101_2=13{10}=D_{16}, 1100_2=12_{10}=C_{16}$
小数部分: $(0.DC){16}$
結合して: $(4E.DC){16}$
(答) $(4E.DC)_{16}$
(5) 8進数 $(74)_8$ を 2進数に変換:
各桁を3桁の2進数に変換: $7_8 = (111)_2, 4_8 = (100)_2$
結合して: $(111100)_2$
(答) $(111100)_2$
(6) 16進数 $(A5){16}$ を 2進数に変換 (Aは10進数で10):
各桁を4桁の2進数に変換: $A{16}=10_{10}=(1010)2, 5{16}=(0101)_2$
結合して: $(10100101)_2$
(答) $(10100101)_2$
練習問題はいかがでしたか? 全て正解できれば、n進数の変換方法はかなり理解できているはずです。もし間違えた問題があっても、慌てずに解答と解説をよく見直して、計算手順や原理を再確認してみてください。繰り返し練習することが習得への一番の近道です。
10. まとめ:n進法変換マスターへの道
この記事では、n進法の基本から、最も重要な「変換方法」までを、約5000語のボリュームで徹底的に解説してきました。
重要なポイントを振り返ってみましょう。
- n進法の基本: n進法は、基数 $n$ と位取り記数法に基づいています。0から $(n-1)$ までの $n$ 個の数字を使い、各桁の値はその桁の位に対応する基数 $n$ のべき乗にその桁の数字を掛けたものです。
- 10進数 → n進数:
- 整数部分は、目的の基数 $n$ で繰り返し割り算を行い、余りを下から順に並べます。
- 小数部分は、目的の基数 $n$ で繰り返し掛け算を行い、整数部分を上から順に並べます。
- n進数 → 10進数:
- 各桁の数字に、その桁の位に対応する基数 $n$ のべき乗を掛け、それらをすべて合計します。小数以下の位には負のべき乗を使います。
- n進数同士の変換:
- 一般的には10進数を介して変換します。
- 特に2進数、8進数、16進数の間は、8=$2^3$、16=$2^4$ という関係を利用し、2進数を3桁または4桁ずつグループ化することで直接変換できます。
- なぜ学ぶのか: コンピュータが2進法で動いているため、情報技術を理解する上で必須の知識です。8進数や16進数は、長い2進数を人間が扱いやすくするために利用されます。
n進法の変換は、最初は複雑に感じるかもしれませんが、原理を理解し、計算手順を繰り返し練習することで、必ずマスターできます。特に、割り算や掛け算の原理をしっかり頭に入れることが、単なる手順の暗記ではなく、深い理解に繋がります。
現代社会はデジタル技術に支えられており、その根幹にはn進法があります。n進法を理解することは、ブラックボックスになりがちなコンピュータの仕組みを垣間見ることでもあります。
この記事を通して、あなたがn進法に対する苦手意識を克服し、自信を持って変換を行えるようになることを願っています。さらに深く学びたい場合は、n進数の四則演算や、様々なデータ表現(符号付き整数、浮動小数点数など)におけるn進数の利用法などを調べてみると良いでしょう。
n進法変換マスターへの道は開かれました! これからも積極的に学びを続け、情報技術の世界をさらに深く理解していきましょう。
11. 付録:覚えておきたいこと・用語集
覚えておきたいこと:
- n進法では、0から $(n-1)$ までのn個の数字を使います。
- 10進数からn進数へ(整数): 繰り返し「割り算」、余りを「下から」。
- 10進数からn進数へ(小数): 繰り返し「掛け算」、整数部分を「上から」。
- n進数から10進数へ: 各桁の数字 $\times$ 基数の「べき乗」の合計。
- 2進数 ⇔ 8進数: 2進数を「3桁」ずつグループ化。
- 2進数 ⇔ 16進数: 2進数を「4桁」ずつグループ化。
- 16進数のアルファベット: A=10, B=11, C=12, D=13, E=14, F=15。
用語集:
- n進法 (n-ary number system): 基数 $n$ を使って数を表現する方法。
- 10進法 (Decimal system): 基数10を使う記数法。私たちが普段使用。
- 2進法 (Binary system): 基数2を使う記数法。コンピュータが使用。
- 8進法 (Octal system): 基数8を使う記数法。
- 16進法 (Hexadecimal system): 基数16を使う記数法。
- 基数 (Base / Radix): その進法で数を表現する際の基準となる数。使う数字の種類と、位が上がるごとの倍率を定める。
- 位 (Place / Digit position): 数字の並ぶ位置。位によって、その桁が持つ値の重み(基数のべき乗)が決まる。
- 位取り記数法 (Positional numeral system): 数字の位置によってその数字が表す大きさが変わる記数法。10進法やn進法はこの方式。
- 変換 (Conversion): ある進法の数値を、別の進法の数値に置き換えること。
- 循環小数 (Repeating decimal / Recurring decimal): 小数点以下の同じ数字の並びが無限に繰り返される小数。他の進法に変換した際に発生することがある。
これで、n進法の変換方法に関する詳細な解説は終わりです。この知識が、あなたの学習や仕事に役立つことを願っています。