本当に初心者の人に捧げるコンピューター入門


ソフトウェア:データ編 その1

コンピューターは数しかわからない

 さて、前にも書いたとおり、コンピューターはソフトウェアがなければ粗大ゴミです。
 それではソフトウェアとは一体どういう素性の物なのでしょう?
 一言でいってしまえば下のようになります。

ソフトウェア=データ(計算される値)+プログラム(計算の手順)

 そこでまずこの章ではデータという物がどうやって表現されているかということに関して解説します。


基本中の基本は



 まず最初に知っておかなければならないことは、コンピューターとは所詮のところ「計算機」なのです。従って以下の大原則があります。

1) コンピューターは数しかわからない
2) しかもコンピューターがわかるのは二進法の数だけである

 まずこれはしっかり覚えておいてください。


二進法ってなんだったっけ?



 さて、前項の1)はまあいいとして二進法って何でしたっけ?たぶん昔に習った記憶があるのではないでしょうか?

 普段私たちが一般に使っている数は10進法です。
 例えば123という数があります。これはすなわちある数を以下のように現すことです。

 123 = 1・100 + 2・10 + 3・1
     = 1・102 + 2・101 + 3・100  (100って1のことでしたね)
 この数を2進法で現すと以下のようになります。

 1111011 = 1・64 + 1・32 + 1・16 + 1・8 + 0・4 + 1・2 + 1・1
         = 1・26 + 1・25 + 1・24 + 1・23 + 0・22 + 1・21 + 1・20
 12進法で現せば
(12進法では数字が12個いります。そこでA=10、B=11とします)

 A3 = 10・12 + 3・1 = A・12 + 3・1
 16進法で現せば
(16進法では数字が16個いります。そこでA=10、B=11・・・F=15とします)

 7B = 7・16 + 11・1 = 7・16 + B・1
 この10進法とか2進法というのは「位取り記数法」という大変便利な概念の一部です。これは大昔にインド人が見つけました。これの便利なところは、どんな大きな数でも10進法なら10個、2進法なら2個の数字で表せるという点にあります。


何で二進法などを使うのか?



 どうして二進法などという物を使うのでしょう?
 その理由は数字が2個しかなくていいので便利だということです。

 世の中もっとも簡単なのは「あるかないか」です。例えば現在のメモリーならば ある場所に電気が溜まっていたら1という数字が書かれている。溜まってなければ0という数字が書かれている、という規則で作られています。

 もちろん現在の技術を使えば、ある場所にこれだけ溜まっていれば1、もっと溜まっていれば2とかいうようなハードウェアも作れますが、普通はそうしません。その理由は「面倒だから」もしくは「今のでうまく行っているのに何でそんなややこしい物を作らんといかん?」です。
 というわけでとにかくコンピューターは二進法の数しかわからないのです。


実際に扱える数の制限



 ならば数ならどんなものでもわかるかというとそうではありません。コンピューターがそのままわかる数とは

  8ビットCPU      0〜255
  16ビットのCPU  0〜65,535
  32ビットCPU    0〜4,294,967,295
こんなものです。
 ところで変な数だと思うでしょう。でもコンピューターの世界ではこれがキリのいい数なのです。

 256 は二進法で 100000000                               = 28
 65536 は同様に 10000000000000000                       = 216
 4294967296 は  100000000000000000000000000000000       = 232
 とにかく2nで現される数はみんな1000・・・となってキリがいいんですね。よく見れば指数の8、16、32も二進法では100,1000,10000でした。
 CPUでよく16ビットとか32ビットのCPUだと言われますが、これはいい加減に言えばそのCPUが扱える数の二進法で表記した場合の桁数です。


ビットとバイト



 ところでコンピューターの世界ではよく「ビット」とか「バイト」という言葉が使われます。前の章でも説明なしに勝手に使っていますね。ではビットとは一体なんでしょう?一言で言えば、

ビットとは情報量の最小単位である。

ですが・・・いきなりこれでわかった人ははっきり言って偉いです。

 ビットという概念は情報理論の中で生まれました。情報理論とはもともと「通信」をいかに効率的に行うかということを数学的に解析した理論です。
 通信とは例えば伝言とか手紙とか電話とかモールス信号とかで他の人に「情報」を伝える手段です。通信をいかに効率的に行うかというのは重要な問題です。その際に問題になってくるのが「情報とは何か」ということです。扱う物の本質が分かっていなければ、扱いようがないのは当然ですね

 しかし「情報」とはよく使う言葉ですが、大変漠然とした概念です。辞書を見ると「判断や行動に役立つ知識」とか書かれていますが、結局なんだかよくわかりません。
 情報の理論を作るに当たってまず問題になるのが「情報」という物をどうとらえるかでした。
 科学的に物を考えようとしたならば、普通は以下のような方法で複雑な対象を表現します。

 1. ある対象をそれ以上分割できない部分にまで分割する
 2. 部分を組み合わせることで対象を再現する。

 これを情報に当てはめてみると、

 1. 情報というものそれ以上分割できない単位にまで分割する
 2. 単位を組み合わせることで元の情報を再現する。

となります。
 それではそれ以上分割できない情報とはどんな物でしょう?それはすなわち「はい/いいえ」です。これをさらに分割しようとすると、「はい」だけとか「いいえ」だけになりますが、この言葉は二つセットであるからこそ相手に「情報」を伝えられます。
 というわけで、情報理論では「はい」または「いいえ」で表される情報を1ビットと定義して、情報量の最小単位としました。
 と、ここで以下のような疑問はわきませんか?

 ちょっと待ってくれ!「はい」「いいえ」というのが意味を持つのは、元の質問があるからだ。これだけ独立していても意味がないじゃないか!

 まさにその通りです。しかし実は情報理論では情報の持つ意味という物を取り扱いません。すなわち「やあ。ゲイツ大統領。明日核ミサイルのボタンを押すかね?」「はい」と、「黄色の望遠鏡は芥子明太子が愛しているか?」「はい」の二つの質問に対する答え「はい」は、その意味にかなり重大な違いがあるにも関わらず、同じ1ビットです。
 もっと言ってしまえば、情報理論では「情報」とはビットが複数個まとまったものであり、それ以上でも以下でもないと考えます。すなわちそれが表しているのが何かと言うことにはまったくお構いなく、はい、いいえ、いいえ、はい、はい・・・といった物(記号列)が情報理論での情報なのです。

 何か変じゃないかって?確かに変ですか変じゃありません。
 もしかして昔、図形の「円」がどうして丸いのか悩んだことはありませんか?これは悩むことが間違いで、丸い物が円だと「定義」されているからなのです。すなわちみんなでそういう物をそう呼ぼうと決めたからそうなっているだけでした。
 情報理論における「情報」というのはそういう物なのです。

 そしてコンピューターが扱う情報というのも、まさに「この意味での情報」でしかないのです。コンピューターはよく「情報処理機械」と言われますが、そこで扱われている情報には「意味」が完全に抜け落ちています。コンピューターが扱う情報とは「単なるビットの羅列」にしかすぎないのです。
 これではHAL9000のようなコンピューターがなかなか現れないのも納得がいくのではないでしょうか。

 さて「はい」とか「いいえ」は英語では「YES」「NO」書きます。そこで「はい」を「1」、「いいえ」を「0」と表記するという規則を作っても、規則に同意してもらえれば問題はありません。
 ここでコンピューターが2進法を使って計算することを思い出しましょう。二進法で表された数値は例えば10111010001とかになります。これを見るとビットが並んでいる!と解釈することもできます。
 というわけで結局、コンピューターの世界ではおおむね1ビットとは以下のような意味で使われています。

 ビットとは、二進法で表した数の一桁のことである。

 すなわち100ビットの情報とかデータといった場合は、そのデータを2進法で表記したら100桁になるということです。
 ビットと並んでよく使われる言葉にバイトがあります。これはビットがわかれば全く問題がありません。なぜなら

 8ビットのことを1バイトと呼んでいる

だけだからです。
 とにかくこの言葉は今後よく使われます。例えばハードディスクの容量が1GBだとか、モデムの通信速度が28800bpsだとか、データの量を表現したいような場合には必ず登場しますので、是非覚えておいてください。

単位 呼び方 意味
KB キロバイト 1,024バイト
MB メガバイト 1,024×1,024=1,048,576 バイト
GB ギガバイト 1,024×1,024×1,024=1,073,741,824 バイト
bps ビーピーエス 通信で一秒間に1ビットのデータ転送速度がある場合に1bpsという

 ええ?ふつうキロとかメガっていうのは1000倍とか1000000倍のことを指すんじゃないか?と思う方もいるでしょう。でもコンピューターの世界では1024は2進法で10000000000となってキリのいい数なのです。


数字が長すぎてうっとうしい



 ところで上を見てもわかるとおり、二進法は0と1しかなくて便利ですが、ちょっとした数でもやたらに桁数が多くなって見づらいですね。たかが200や300程度の数字で9桁にもなってしまいます。
 10進法の世界でも同様で、長い数字に適当に桁区切りを入れます。二進法でも同じような感じで

1,0000,0000,0000,0000

と表記してもいいのですが、さらに長くなってしまいます。
 そこで上の四桁ごとに以下のようなルールで0〜Fの文字を当てはめて

  0000=0  0001=1  0010=2  0011=3  0100=4  0101=5  0110=6  0111=7  
  1000=8  1001=9  1010=A  1011=B  1100=C  1101=D  1110=E  1111=F  
10進法2進法16進法
655351111,1111,1111,1111FFFF
100011,1110,10003E8

と表記するのが良く行われます。
 これは実は数を16進法で表記したのと同じです。コンピューターの世界で本などを見ると16進数で書かれているのはこんな理由によるのです。
 ですからプログラマーが自分の年齢を20歳と主張した場合、実際は32歳です。
 
 これは単に人が見て見やすくするという以上の意味はありません。

  • ちなみに10と単に表記すると十進法の10なのか16進法の10なのかよくわかりません。そこで16進法の場合は10hと表記することが結構普通です。その他にも0x10(C言語系の人)とか&h10(BASIC系の人)とか$10(PASCAL系の人)とかいろいろあります。
[→10進・2進・16進数の対応表]


要するに



 細かいところはともかく一番重要なのは

コンピューターは0〜一定値以内の整数しかわからない

という点です。



前へ 目次へ 次へ