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

講義を始める前に

本日の授業のテーマ

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

  • ビットと2進数
  • 小数
    • 2進数小数から、10進数小数への変換
    • 10進数小数から、2進数小数への変換

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

  • 2進数とビットの関係がわかる。
  • 小数の表記も、整数の延長として捕らえることができる。
  • 2進数と10進数との間で、小数の変換ができる。

先週の復習

  • いろいろな数の表記方法があります。N進数の場合、N個の底で数を表現します。
    N進数
    2 進数 0, 1
    8 進数 0, 1, 2, 3, 4, 5, 6, 7
    10 進数 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    16 進数 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
  • コンピューターの内部で、10進数を使わないで、2進数を使う理由は、
    1. ノイズに強い
    2. ハードウェアーを実現するのが容易
    3. 演算が簡単
    4. ブール代数が使えて、論理演算が容易
    からです。
  • 我々が通常用いていうる、数の表現の意味は、次の通りです。数字の並ぶ順序が重要です。 \begin{align} (1905)_{10}=(1\times 10^3+9\times 10^2+0\times 10^1+5\times 10^0)\nonumber \end{align}
  • 2進数から、10進数への変換は、通常の表記法を考えれば、簡単に計算できます。 \begin{align} (1101)_2 &= (1\times 2^3+1\times 2^2+0\times 2^1+1\times 2^0)\nonumber\\ &=(8+4+0+1)\nonumber\\ &=(13)_{10}\nonumber \end{align}
  • 逆に、10進数から2進数への変換は、2で割った余りを並べることにより計算できます。

    図1: 19を2進数に

    図2: 2003を2進数に

    それぞれは、\((19)_{10}=(10011)_2\),\((2003)_{10}=(11111010011)_2\)である。

ビットと2進数

2進数で数字を表す方法が理解できたと思います。小数や負の数の表現を学ぶ前に、ビットと2進数の関係について、説明をしておいたほうが良いでしょう。

以前、情報の単位として、ビットというものを示したでしょう。このビットと2進数の関係を示します。1ビットでは、2個の状態を表すことができます。2ビットでは4個の状態、3ビットでは8個の状態を表現できます。Nビットあると、2N個の状態を表すことができます。以前に学んだ通りです。

例えば、PICと呼ばれている1チップマイコンでは、図1に示すRB0~RB7のピンがビットに対応しています。これらの8個のピンにより、デジタル信号を入出力します。8本のピンを使っているので、8ビットです。したがって、28=256通りの状態を表すことが出来ます。

0—255の間の整数を出力する場合、以下のピンが各ビットを表します。

図3: PICのピン配列

ピン番号 13 12 11 10 9 8 7 6
名称 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
名称 bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

したがって、\((183)_{10}=(10110101)_2\) を出力する場合、各ピンの電圧は、

ピン番号 13 12 11 10 9 8 7 6
電圧 [V] 5 0 5 5 0 5 0 5
2進数 1 0 1 1 0 1 0 1

となります。5Vが2進数の1を表しています。

図4: 10進数と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}) \label{eq:2003} \end{align}

と表現されます。小数点を境に、右側の指数部が -1, -2, -3 と 1 づつ減少していきます。これは、先に示した整数の場合と全く同じです。簡単ですね。

当然、

\begin{align} 10^{-1}&=\frac{1}{10^1}=\frac{1}{10}=0.1 \nonumber\\ 10^{-2}&=\frac{1}{10^2}=\frac{1}{100}=0.01 \nonumber\\ 10^{-3}&=\frac{1}{10^3}=\frac{1}{1000}=0.001 \\ &\vdots\nonumber\\ 10^{-N}&=\frac{1}{10^N} \nonumber\\ \end{align}

は分かっていますよね。

基数の変換

変換(2進数小数 → 10進数小数)

2進数での少数の表記も、10進数の場合と同様です。だから、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}\\ &=(0.65625)_{10}\nonumber\\ \end{align}

となります。当然、

\begin{align} 2^{-1}&=\frac{1}{2^1}=\frac{1}{2}=0.5 \nonumber\\ 2^{-2}&=\frac{1}{2^2}=\frac{1}{4}=0.25 \nonumber\\ 2^{-3}&=\frac{1}{2^3}=\frac{1}{8}=0.125 \\ &\vdots\nonumber\\ 2^{-N}&=\frac{1}{2^N} \nonumber\\ \end{align}

は分かっていますよね。

変換 (10進数小数 → 2進数小数)

つぎに逆を考えましょう。たとえば、先ほどの 0.65625 を

\begin{align} (0.65625)_{10}=(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) \end{align}

と表現したいのです。それぞれ、\(a_n\)を求めなくてはなりません。両辺 ×2 を実行してみましょう。

\begin{align} (1.3125)_{10}=(a_1\times 2^0+a_2\times 2^{-1}+a_3\times 2^{-2}+a_4\times 2^{-3}+\cdots) \end{align}

となります。この式の両辺の整数部、および小数部同志は等しいので、

\begin{align} (1)_{10}&=a_1 \\ (0.3125)_{10}&=(a_2\times 2^{-1}+a_3\times 2^{-2}+a_4\times 2^{-3}+\cdots) \nonumber \end{align}

となります。\((1)_{10}=(1)_2\)なので、\(a_1=1\)となります。同じように、残りの小数部分を 2 倍すると、

\begin{align} (0.625)_{10}=(a_2\times 2^0+a_3\times 2^{-1}+a_4\times 2^{-2}+a_5\times 2^{-3}+\cdots) \end{align}

となります。同様に、整数部、および小数部同志は等しいので、

\begin{align} (0)_{10}&=a_2 \\ (0.625)_{10}&=(a_3\times 2^{-1}+a_4\times 2^{-2}+a_5\times 2^{-3}+\cdots) \nonumber \end{align}

となります。したがって、a2=0です。次々に、同じ計算を進めると、

\begin{align} &\begin{cases} (1.25)_{10}=(a_3\times 2^{0}+a_4\times 2^{-1}+a_5\times 2^{-2}+a_6\times 2^{-3}+\cdots)\nonumber\\ \qquad\Downarrow \nonumber\\ (1)_{10}=a_3\nonumber\\ (0.25)_{10}=(a_4\times 2^{-1}+a_5\times 2^{-2}+a_6\times 2^{-3}+\cdots)\nonumber\\ \end{cases}\\ \nonumber\\ &\begin{cases} (0.5)_{10}=(a_4\times 2^{0}+a_5\times 2^{-1}+a_6\times 2^{-2}+a_7\times 2^{-3}+\cdots)\\ \qquad\Downarrow \\ (0)_{10}=a_4\\ (0.5)_{10}=(a_5\times 2^{-1}+a_6\times 2^{-2}+a_7\times 2^{-3}+\cdots)\\ \end{cases}\\ \nonumber\\ &\begin{cases} (1.0)_{10}=(a_5\times 2^{0}+a_6\times 2^{-1}+a_7\times 2^{-2}+a_8\times 2^{-3}+\cdots)\nonumber\\ \qquad\Downarrow \nonumber\\ (1)_{10}=a_5\nonumber\\ (0.0)_{10}=(a_6\times 2^{-1}+a_7\times 2^{-2}+a_8\times 2^{-3}+\cdots)\nonumber\\ \end{cases} \end{align}

最後に、小数部がゼロとなったので計算は、完了です。以上をまとめると

\begin{align} (0.65625)_{10}&=(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)\nonumber\\ &=(1\times 2^{-1}+0\times 2^{-2}+1\times 2^{-3}+0\times 2^{-4}+1\times 2^{-5})\\ &=(0.10101)_2 \end{align}

です。要するに、小数部を2倍して、その整数部を書いていけばよいのです。

よく使われるのは、図5のようにして計算します。2倍して、整数部を書き出して、小数部を再度2倍します。これを繰り返すと、10進数小数が、2進数小数に変換できます。

10進数の0.1は循環小数ではありませんが、2進数にすると、

\begin{align} (0.1)_{10}=(0.000110011001100110011\cdots)_2 \end{align}

と循環小数になります。通常は、途中まで(必要な精度まで)で、計算を打ち切ります。

図5: 小数の基数変換(10進数 → 2進数)



no counter