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

講義を始める前に

本日の授業のテーマ

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

  • 2進数と10進数
    • 2進数から、10進数への変換
    • 10進数から、2進数への変換

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

  • 10進数と2進数の相互の変換ができる。

先週の復習

  • ビットとは情報の単位である。
  • 1ビットの情報は、2個の状態を表すことができる。たとえば、
    1. 電流(電圧)が流れいているか、いないか ← コンピューター内部
    2. 磁化の方向がNかSか、(磁化されているか、いないか) ← ハードディスク
    3. 電荷がたっているか、いないか ← 半導体メモリ
    4. 受光できたか否か ← 光通信
    である。
  • 2ビットでは4個の状態、3ビットでは8個の状態を表現できる。Nビットあると、2N個の状態を表すことができます。
  • ビットは不連続量で、自然数です。0.5ビットは有りません。
  • 正8面体サイコロの状態を表すのに必要なビット数は3です。8個の状態があるからです。
  • そのサイコロを2回振った場合、そのサイコロの目を記録するのに必要な情報量は、6ビットです。考え方は、2通り有ります。
    1. 一回目のサイコロの目(1~8)を記録するのに、3ビット必要。同様に、二回目のサイコロの目(1~8)を記録するのにも、3ビット必要。あわせて、6ビット必要になります。
    2. 一回目のサイコロの目は、8通りの可能性があります。同様に、二回目のサイコロの目も、8通りの可能性があります。合わせて、8×8 = 64通りの可能性があります。これは、64 = 26です。したがって、6ビット必要になります。
    前者(1)の方が簡単です。実は、前者の3×2 = 6ビットも、23×23 = 23+3 = 23×2 = 26の計算をしています。根本的には、(1)も(2)も同じです。したがって、100回分記録するためには、3×100 = 300ビット必要です。
  • 1kg単位で、クラス全員の体重を記録するために、何ビット必要か? 一人の体重は、1~128kgの範囲である。したがって、一人を記録するためには27 = 128であるため、7ビット必要です。クラス全体で、7ビット×42人=294ビット必要になります。
  • CDの話は、少し複雑なので省略します。いずれ、講義ノートをwebページに掲載するつもりです。そのとき、見てください。
  • 先週の授業で言い忘れました。情報科学の世界では、ビット(bit)以外に、バイト(Byte)という単位も使われます。補助単位も使われます。
    1 Byte(バイト) = 8 bits (ビット)
    以下のような補助単位が使われます.
    1 kByte = 1024 Byte キロ k = 210 = 1024
    1 MByte = 1048576 Byte メガ M = 220 = 1048576
    1 GByte = 1073741824 Byte メガ G = 230 = 1073741824
    1 TByte = 1099511627776 Byte テラ T = 240 = 1099511627776
    自然科学では1000=103で単位が変わりますが、情報科学では1024 = 210で変わります。

新たな世界へ (2進数の世界)

N進数法とは

通常使われる数字は、10進法です。これは、0~9の数字を用いて、数を表現します。コンピューターの内部では、2進法を使っています。0と1だけの2個の数字で、すべての数を表現します。1ビットという単位が2個の状態を表すのと対応しています。

N個の数字で数を表すのをN進数といいます。また、基数がNと言うこともあります。また、その底は、(0, 1, 2, 3, …, N-1)です。例えば、

N進数の基数と底
数の表現 基数
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
10 2 2 2
11 3 3 3
100 4 4 4
101 5 5 5
110 6 6 6
111 7 7 7
1000 10 8 8
1001 11 9 9
1010 12 10 A
1011 13 11 B
1100 14 12 C
1101 15 13 D
1110 16 14 E
1111 17 15 F
10000 20 16 10
10001 21 17 11
10010 22 18 12
10011 23 19 13

なぜ2進数で表現するか

人間の指は、10本あります。そのため、人類は10進法を使っていると言われています。コンピューターの内部では、電圧が0Vか5V(もっと低い場合もある)で表現をします。指が2本しかないのと同じです。だから、コンピューターは2進法を使うのです。

では、2進法を使うメリットとは、何があるのでしょうか? 10進法ではなく、2進法を使う理由は、どこにあるのでしょうか? 大体、以下の理由が挙げられます(教科書P.11)。

  1. ノイズに強い

    0 – 10Vで動作する素子からできたコンピューターを考えよう。2ビットと10ビットの場合、割り当てられる電圧のレベルは、図1の通りです。図から分かるように、許されるノイズは、2ビットの方が格段に大きくなります。1ビットのエラーも許されないデジタルコンピューターにおいては、この差は大きい。

    図1: 電圧の振り分け(2進数10進数)

  2. ハードウェアーを実現するのが容易

    コンピューター内部には、単純な動作をする。同じような部品が数多くあります。2進数であれば、入力は0と1、出力も0と1なので、構成する1個の部品が非常に単純になります。

  3. 演算が簡単

    例えば、掛け算九九を考えると分かります。10進数だと、0~9までの掛け算、合計100通りあります。2進数だと、4通りしかありません。

  4. ブール代数が使えて、論理演算が容易

    ブール代数については、後の講義で勉強します。ここでは、省略。

とはいえ、世界初の電子計算機ENIACは、10進法が使われていました。それ以降の通常の電子計算機は、すべて2進法です。

数字の表現方法

例えば、今年は2003年です。10進数の2003の表記はどのような意味があるのでしょうか? これは、次のように解釈します。えらそうですが、こう解釈すると、他の底の数字の意味がわかりやすくなります。

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

括弧の下の10は、10進法の意味です。

コーヒーブレイクゼロがない時代は、大変だったのです。ゼロが無いと、(1)のような表記は出来ません。0 (ゼロ)が発見されたのは、6世紀頃のインドと言われています。西暦0年がないのは、このためです。西暦が考えられた頃は、ゼロがなかったのです。

変換(正の整数の場合)

数の変換 (2進数から10進数へ)

これは、簡単です。式\eqref{eq:2003}を理解していれば、分かります。2進数であろうが、10進数であろうが、表記法は同じです。すなわち、

\begin{align} (10011)_2 &= (1\times 2^4+0\times 2^3+0\times 2^2+1\times 2^1+1\times 2^0)\nonumber\\ &=(16+0+0+2+1)_{10}\nonumber\\ &=(19)_{10} \end{align}

となります。ただ、基数が違うだけです。ところで、この演算を施すと、なぜ、10進数に変換されるのでしょうか? 3進法や5進数ではなく、われわれが普通に使う10進数に変換された理由は、なぜでしょうか? 10進数は特別なのでしょうか? いいえ、10進数は特別ではありません。みなさん、考えてください。

数の変換 (10進数から2進数へ)

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

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

と表現したいのです。それぞれ、\(a_n\)を求めなくてはなりません。そこで、次の変形を考えましょう。

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

となります。これをよくにらむと、\(a_0 = 1\)ということが分かります。すなわち、\(a_0\)は19を2で割ったあまりです。残りの部分は、

\begin{align} (9)_{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} (4\times 2+1)_{10}=(a_2\times 2^0+a_3\times 2^1+a_4\times 2^2+a_5\times 2^3+\cdots)\times 2+a_1 \end{align}

となります。したがって、\(a_1 = 1\)になります。しつこいようですが、さらに同様に進めると、

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

となります。最後の式から、\(a_n=0\quad(n\geq 5)\)が分かります。以上をまとめると

\begin{align} (19)_{10}&=(a_4\times 2^4+a_3\times 2^3+a_2\times 2^2+a_1\times 2^1+a_0\times 2^0) \nonumber\\ &=(1\times 2^4+0\times 2^3+0\times 2^2+1\times 2^1+1\times 2^0) \nonumber\\ &=(10011)_2 \end{align}

です。要するに、2で割ったあまりを書いていけばよいのです。よく使われるのは、以下のようにして計算します。

図2: 19を2進数に

図3: 2003を2進数に

それぞれは、

\begin{align} (19)_{10}&=(10011)_2\\ (2003)_{10}&=(11111010011)_2 \end{align}

に対応します。よく、内容を理解して、変換の練習をしてください。



no counter