原始,人間は指を折って数を数えた。デジタルの語源であるdigitは「指」を意味する。11以上の数は,ほかの人の手を借りて数えた。要するに桁上がりだ。しかし,コンピュータは人間とは違って2進数で演算処理を行う。そんな「機械と人の数の数え方」について調査した。

2進数だって人間の都合でできている

 2進数とは「0または1のどちらかの値しか持たない,数の数え方」だ。コンピュータの処理がこの2進数を基本にしていることは,皆さんご存じだろう。なぜ,コンピュータは10進数ではなくて2進数で計算するのだろう? もしかすると,コンピュータの都合で決まっているように見えるかもしれない。

 実のところ,0とか1とか2進数とかいった考え方自体もまた非常に人間寄りなものだ。CPUは,自分の扱っているデータが0か1か,ましてや,それに基づく数の数え方が2進数かどうかなんて,みじんもわかっていない。

 CPUに判断できるのは,メモリーを構成する素子に一定の電圧が掛かっているかどうかだけだ。一定の電圧が掛かっていれば1,そうでなければ0と見なすのも人間の都合である。そして,その仕組みを利用して0と1の二つの値で2進数を表現するというのも,やはり人間の都合なのだ。

 コンピュータが扱う2進数を,8個並んだ電球で説明する図1のような絵を見たことがある人も多いと思う。電球がついていればON(1),消えていればOFF(0)という前提で,メモリーの状態を説明しているわけだ。

図1●8個の電球でメモリーの状態を表す
図1●8個の電球でメモリーの状態を表す

 我々人間は,電球がついているか消えているかという二つの状態だけではなく,その明るさも認識できる。煌々(こうこう)と光り輝いている状態と,今にも消えそうにうすぼんやりと光っている状態,あるいはその中間の状態――などを識別できる。

 が,2進数のたとえでは単純に「ついているか消えているか」だけを問題にする。実際には,電球に掛かる電圧によってその明るさは異なるのだが,そこはあっさりと無視して,「電気が流れていれば1」と割り切ってしまおう,ということである。このようにすることで,状態のあいまいさを排除できる。明るかろうがうすぼんやりだろうが,電球がついていれば,とにかく1なのだ。

 我々の生きているアナログの世界は,実に中途半端でまことにあいまいだ。それに対してコンピュータの仕切っているデジタルの世界は非常に明確で,とても正確だということになっている。しかし,デジタルとはアナログの対極にあるのではなく,アナログ的世界観の中の一断面に過ぎない。連綿と続く状態を適当な――わかりやすい,または制御しやすい――ところで割り切って判断しましょう,というしきたりがデジタルなのである。

 コンピュータのよりどころである電子の世界は,アナログの現実世界である。5Vの電圧が掛かっているはずでも,測ってみると4.3Vだったり5.1Vだったりする。そこで,実際には0Vか5Vかではなくて,例えば「2.5V以上ならON,それ未満だったらOFF」などと規定してある。つまり「状態に幅を持たせる」ということだ(図2)。こうすれば実用的な確度でONとOFFの状態を保持できる。

図2●電圧に幅を持たせることでON/OFFの割り切りをしやすくなる
図2●電圧に幅を持たせることでON/OFFの割り切りをしやすくなる

 この割り切りを,0か1かに限定していることには大きな意味がある。我々になじみのある10進数で同じことをやろうとすると,「0.5V未満なら0,0.5~1.0V未満なら1,1.0~1.5V未満なら2…」のように許容値が狭くなって,値を正確に保持するのが難しくなる。

 OFFとONの二つの状態を0と1と見なすよう割り切ってしまえば,非常に高速な計算が可能になる。回路は簡単になるし,使うのは0と1の二つの値だけだから足すのも引くのもあっという間。乗算は加算の繰り返し,除算は減算の繰り返しで対処できるから,九九なんてものも必要ない。