5.1 コンピューターで2進数が使われる理由
人間の指は10本あることは,よく知られている.そのため,人類は10進法を使っていると
言われている.小学校の低学年では指を使って計算する子供がいることからも分かる.コ
ンピューターの内部のハードウェアーでは,電圧が0Vか5V(もっと低い場合もある)でデー
タやプログラムを表現している.指が2本しかないのと同じ.だから,コンピューターは2
進法を使う.2進法を使うメリットに,何があるか? という疑問が湧くであろう.その答
えとして,以下のようなことが考えられる.
- ノイズに強い
0〜5Vで動作する素子からできたコンピューターを考える.2ビットと10ビット
の場合,割り当てられる電圧のレベルは,図5の通りであ
る.図からも分かるように,許されるノイズは,2ビットの方が格段に大きく
なる.1ビットのエラーも許されないデジタルコンピューターにおいては,こ
の差は非常に大きい.
- ハードウェアーを実現するのが容易
コンピューター内部には,単純な動作をする同じような部品が数多くある.2進数であれ
ば,入力は0と1,出力も0と1なので,構成する1個の部品が非常に単純になる.要するに
2進数を採用すると,部品が簡単になるのである.
- 演算が簡単
例えば,掛け算九九を考えると分かる.10進数だと,0〜9までの掛け算,合計100通りあ
る.2進数だと,4通りで済む.
- ブール代数が使えて,論理演算が容易
ブール代数については,他の授業で勉強することになっている.それまで待て
ない人は,私の講義ノートでも見ろ.
図 5:
2進法と10進法のコンピューターのノイズレベル
|
それでは,2進数のデメリットとはどのようなことが考えられるであろうか?.すぐに分か
ることは,桁数が多くなることである.例えば,十進法の

は,二進法では

となる.十進法であれば2桁で済むのに,2進法であれば7桁も必要になる.
このことは,コンピューターが発明された当初問題とされたが,すぐにこれは間違いだと
気づく.ある正の整数
をそれぞれの位取記数法で表した場合,その底の数
と
桁数
を表2にしめす.
進数の場合,整数
を表すの必要な桁数
は次のようにして理解できる.
進数が
桁あると,
それが表すことができる組み合わせの数は,
となる.これが,s整数
まで表す
ことができるから,
 |
(12) |
となる.したがって,必要な桁数は,
 |
(13) |
となる.
表 2:
整数
を表すときの底と桁数
底の数 |
桁数 |
1 |
 |
n |
 |
k |
1 |
それでは,一番効率のよい底の数はいくつであろうか?.効率の定義はいろいろ出来るが,
ここでは
- 底の数と桁数で評価することにする.ある整数を表す場合,これらの数の合計が
小さいことが,効率がよい.
とする.

進数で正の整数

を表す場合,効率は,
 |
(14) |
となる.これが最小となるのは,

で微分したときゼロとなる,
である.この方程式の解,すなわちもっとも効率の良い底を図
6に示
す.この図から分かるように,比較的小さな数字(

)では4進数あたりが効率が
よい.大きな数になると10進数程度が最適な底となる.コンピューターが扱う最大の数は,
大体

程度
4である.これだと,2進数で32桁,10進
数で10桁である.この場合,図から分かるようにもっとも効率の良いのが6進数であるが,
これだと,13桁が必要である.2進数,6進数,10進数をつかっても,桁数は10〜32
である.コンピューターにとって,32桁を取り扱うことは簡単なことなので,2進数で数
字を表現しても全く問題ない.10進数をつかうことに比べて3倍程度の桁数の増加にしか
すぎないのである.2進数を使うことによる桁数の増加は,さほど大きなデメリットではない.
それよりも,2進数を使うメリットの方が圧倒的に多い.
図 6:
もっとも効率の良い底.横軸は整数で,縦軸はその整数を表すときのもっと
も効率の良い底.
|
10進数での小数の表現を考える。例えば,小数の表現,
と整数の場合と同じようになっている。小数点を境に、右側の指数部が-1, -2, -3と1ず
つ減少する。これは、先に示した整数の場合と全く同じで,簡単である。当然,
は理解していなくてはならない.
2進数での少数の表記も、10進数の場合と同じである。だから、2進数少数を10進数少数に
変換するのは簡単である。たとえば、
となる.当然
は理解していなくてはならない.
つぎは,先ほどと逆を考える.たとえば,先ほどの例の

を2進数で表現
する.そのためには,
と書き直せばよい.ただし,

は0または1である.そして,この

を並べると,
 |
(21) |
と2進数で表現できる.ここで,問題は

を求めることである.そこで,式
20の両辺を2倍する.すると,
 |
(22) |
となる.この式の両辺の整数部と小数部は等しいので,
|
 |
|
 |
|
(23) |
となる.これで,

が求まった.同じように,残りの小数部分を2倍すると,
 |
(24) |
となる.これも,両辺の整数部と小数部が等しいので,
|
 |
|
 |
|
(25) |
が得られる.これで,

が求まった.同様に以下の通り,残りの小数部分の計算を進める
と,全ての

が求まる.
最後に、小数部がゼロとなったので計算は、完了となる。以上をまとめると
となる.要するに、小数部を2倍して、その整数部を書いていけばよい.
よく使われるのは、図7のようにして計算を進める.2倍して,整数部を書
き出して,小数部を再度2倍する.これを繰り返すと,10進数小数を2進数小数に変換する
ことができる.10進数の0.1は循環小数ではないが、2進数にすると、
 |
(30) |
と循環小数になる.通常は,途中まで(必要な精度まで)で,計算を打ち切る.
図 7:
小数の基数変換(10進数
2進数)
|
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成19年6月24日