Yamamoto's Laboratory
電子計算機
  第6回

講義を始める前に

本日の授業のテーマ

本日の授業のテーマは,以下のとおりです.

  • ビットと2進数
  • 小数
    • 数の表現 (8進数及び16進数)
    • 基数の変換

本日の授業のゴールは、以下のとおり。

  • 2, 8, 10, 16進数の相互の変換ができる。

先週の復習

  • ビットと2進数について、説明しました。2進数の各桁は各ビット(bit 0, bit 1, bit 2, …)を表し、桁数は情報の量(単位:ビット)を表します。
  • 10進数の小数の表現は、次のようになります。 \begin{align} (0.1235)_{10}=(1\times 10^{-1}+2\times 10^{-2}+3\times 10^{-3}+5\times 10^{-4})\nonumber \label{eq:2003} \end{align}
  • 2進数の小数の表現も同じです。したがって、2進数小数を10進数小数への変換は、簡単です。 \begin{align} (0.10101)_2 &= (1\times 2^{-1}+0\times 2^{-2}+1\times 2^{-3}+0\times 2^{-4}+1\times 2^{-5})\nonumber\\ &=(1\times 0.5+0\times 0.25+1\times 0.125+0\times 0.0625+1\times 0.03125)_{10}\nonumber\\ &=(0.5+0.125+0.03125)_{10}\nonumber\\ &=(0.65625)_{10}\nonumber\\ \end{align}
  • 10進数小数から2進数小数への変換は少し難しくて、2倍して、その整数部分を書き出します。場合によっては、循環小数になる場合もあります。 \begin{align} (0.625)_{10}&=(0.10101)_2\nonumber\\ (0.1)_{10}&=(0.000110011001100110011\cdots)_2\nonumber \end{align}

表現

今まで学習した通り、コンピューターの動作は2進数で表現されます。しかし、2進数だけで、それを記述すると、0と1の並びが非常に多くなって、間違いやすいし煩雑です。そこで、2進数を3桁ずつ区切った8進数や、4桁ずつ区切った16進数が使われます。

コンピューターの内部では、1バイト(= 8ビット)毎に処理されることが多いので、8進数よりは16進数が使われることのほうが多いです。8ビットだと2進数の8桁なので、16進数だと2桁で済みます。一方、8進数だと、困った問題が生じます。

1バイトを1桁で表現するともっと良いのですが、256進数となり、256文字必要で、ちょっと人間には、無理があります。

数の表現

今までの学習から、8進数や16進数の表現は理解していることと思います。もう一度、基数と底の関係を示します。そして、数の関係も示しておきます。

重要なことは、8進数の場合、7に1を加えると、桁上がりが生じ10になることです。同様に16進数の場合、Fに1を加えると、桁上がりが生じ10になります。

数の表現 基数
2 進数 2 0, 1
8 進数 8 0, 1, 2, 3, 4, 5, 6, 7
10 進数 10 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
16 進数 16 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F



2進数 8進数 10進数 16進数 楔形文字 ローマ数字
0 0 0 0
1 1 1 1 I
10 2 2 2 II
11 3 3 3 III
100 4 4 4 IV
101 5 5 5 V
110 6 6 6 VI
111 7 7 7 VII
1000 10 8 8 VIII
1001 11 9 9 IX
1010 12 10 A X
1011 13 11 B XI
1100 14 12 C XII
1101 15 13 D XIII
1110 16 14 E XIV
1111 17 15 F XV
10000 20 16 10 XVI
10001 21 17 11 XVII
10010 22 18 12 XVIII
10011 23 19 13 XIX

基数の変換

変換 (8 or 16進数 → 10進数)

10進数への変換方法の前に、数の表記方法について、復習しましょう。これを理解していると、これらの変換は簡単です。例えば、教科書の中にある\((376)_{10}\)を考えましょう。10進数の 376 の表記はどのような意味があるのでしょうか? これは、次のよう意味がありましたね。

\begin{align} (376)_{10} = (3\times 10^{2}+7\times 10^{1}+6\times 10^{0})_{10} \label{eq:376_10} \end{align}

括弧の下の 10 は、10進法の意味です。非常に簡単です。これさえ、分かれば基数の変換なんか簡単です。数字の並ぶ順序が重要です。それでは、手始めに8進数を10進数に変換してみましょう。この表現は

\begin{align} (376)_8 &= (3\times 10^{2}+7\times 10^{1}+6\times 10^{0})_8 \nonumber\\ &= (3\times 8^{2}+7\times 8^{1}+6\times 8^{0})_{10}\label{eq:376_8}\\ &=(3\times 64+7\times 8+6\times 1)_{10}\nonumber\\ &=(254)_{10} \nonumber\\ \end{align}

です。今までのプリントでは、\eqref{eq:376_8}式の第1行の左辺の下添字が8の式を飛ばしていたと思います。正確にはこのように書くべきでしょう。\eqref{eq:376_10}式との対応も非常に良いので、満足できます。そして、第2行で10進数に変換するので、ここから下添字を10とすべきでしょう。いままで、少しすっきりしないところが有ったのですが、これで満足です\(^o^))/。

同じことを16進数で、やってみましょう。

\begin{align} (376)_{16} &= (3\times 10^{2}+7\times 10^{1}+6\times 10^{0})_{16} \nonumber\\ &= (3\times 16^{2}+7\times 16^{1}+6\times 16^{0})_{10}\label{eq:376_16}\\ &=(3\times 256+7\times 16+6\times 1)_{10}\nonumber\\ &=(886)_{10} \nonumber\\ \end{align}

\eqref{eq:376_10} — \eqref{eq:376_16} 式まで、調和が取れていて非常に良いです。

2進数と 8, 16進数の関係

以前、2進数の桁数が情報量であるビット数を表すことを言ったと思います。8進数や16進数の場合について、2進数と比較しながら、その様子を図1に表します。\(8=2^3\)であることから、2進数の3桁ずつ区切り、その値を8進数で示せば、8進数の表現になります。16進数の場合も同様です。したがって、8進数の1桁は3ビットを表し、16進数の1桁は4ビットを表します。

図1: 各進数とビットの関係。(3434)10を2, 8, 16進数で表している。(3434)10=(6552)8=(D6A)16

2進法から、8や16進法に変換することは、簡単であることが分かったでしょう。なにも、これは整数に限ったことではありません。小数でも同様に成り立ちます。証明は、以下の通りです。ある任意の小数をxとして、その範囲を 0 < x < 1 とします。この x を2進数の表現から、3桁ずつ区切り8進数の表現になることを示します。

\begin{align} (x)_2 &= (a_1\times 10^{-1}+a_2\times 10^{-2}+a_3\times 10^{-3}+a_4\times 10^{-4}+a_5\times 10^{-5}+\cdots)_{2} \nonumber\\ &= (a_1\times 2^{-1}+a_2\times 2^{-2}+a_3\times 2^{-3}+a_4\times 2^{-4}+a_5\times 2^{-5}+\cdots)_{10}\\ &= ([4a_1+2a_2+a_3]\times 2^{-3}+[4a_4+2a_5+a_6]\times 2^{-6}+\cdots)_{10}\nonumber\\ &= ([4a_1+2a_2+a_3]\times 8^{-1}+[4a_4+2a_5+a_6]\times 8^{-2}+\cdots)_{10}\nonumber\\ \end{align}

\(4a_1+2a_2+a_3\) は、0以上7以下の整数であることは明らかなので、証明は終わりです。この結果を用いた例を図2に示します。16進数の場合も、まったく同じです。

図2: 2進数小数を8および16進数の小数に変換。(0.100110101111)2 = (0.4657)8 = (0.9AF)16

相互の変換 (2, 8 , 10, 16進数)

2, 8, 10, 16 進数の相互の変換について考えましょう。以前の授業で、2進数と10進数との変換はどちらの方向でも簡単であることを示しました。本日の授業で、8及び16進数を10進数に変換する方法を示しました。また、先ほど2進数から8及び16進数への変換が簡単であることも示しました。一方、その逆、8及び16進数から2進数への変換も簡単です。8進数を構成している数字を(1, 2, 4)の和で表すことにより、2進数に簡単に変換できます。16進数も同様で、(1, 2, 4, 8) の和で表すことにより、2進数に変換できます。例えば、16進数から2進数への変換は、図3のように行います。

図3: 16進数から2進数への変換。(B7)16=(10110111)2

残りは、10進数を8及び16進数に変換することです。人間にとって少しめんどくさいですが、2進数同様に、8や16で割っていって、その余りから計算する方法もあります。例えば、図4の左のような方法です。一旦、2進数に変換して、それを16進数に変換する方法もあります(図4の右)。与えられた問題によって、計算が楽なほうを用いればよいでしょう。

今まで、学習してきた2,8,19,16進数の基数の変換方法を図5に示しておきます。本当は、基数はどれも平等なので、同じテクニックで変換できるはずですが、10進数になれた人間には、状況によって、得手、不得手があります。

図4: 10進数から16進数への変換。8進数でも同じです。

図5: 基数の変換方法(2, 8, 10, 16進数)のまとめ。



no counter