解説
プログラムは、コンピュータに命令を実行させる手段です。コンピュータは、データを0と1で表わされた2進数の数字として扱います。この2進数について解説します。
普段、私達が両手で数えて使っている数字は、10ごとに桁が上がる、10進数という数え方です。世の中には、他にも色々な数え方があります。時計のように、60秒で1分のように桁が上がる数え方もあります。また、ビール箱のように、12本単位で数えるダースといった数え方もあります。2進数は、こういったものと同じような「数え方」になります。
では、2進数とはどんな数え方なのでしょうか? それは、2ごとに桁が上がる数え方です。0、1の次は、2ではなく、桁が1つ上がって10になります。慣れない人は、ちょっと分かり難い数え方だと思います。
2進数 10進数 0 0 1 1 10 2 11 3 100 4 101 5 110 6 111 7 1000 8 : :
なぜ、こんな特殊な数え方をするのでしょうか? それはコンピュータの機械的な仕組みが関係しています。その一例を、データの記録という面から見てみます。
コンピュータでは、数値などの情報を、記録場所に読み書きして管理しています。この記録場所は、分かりやすく言うと、コップが大量に並んでいるような状態になっています。
│ ││ ││ ││ ││ │ │ ││ ││ ││ ││ │ │ ││ ││ ││ ││ │ └─┘└─┘└─┘└─┘└─┘
このコップの中に水が入っているかどうかで、情報が「ある」か「ない」かを判断しています(実際には、この「コップの水」というのは、電磁的な記録だったり、光学的に読める物だったりします)。
問題なのは、このコップの中の水をどう読み取るかです。1%の水が入っているから「1」、98%の水が入っているから「98」と読んでもよいのですが、機械の精度が要求されます。また、読み取りエラーが置きやすくなります。
一番単純なのは、たとえば50%以上入ってれば「1」、未満なら「0」のようにして、「入っている」か「入っていない」かだけを判断する方法です。こうすれば、機械の精度はあまり要求されず、エラーも減ります。高速に読み書きしても、あまりトラブルは起きません。
このようにした場合、記録場所に0と1が大量に並ぶことになります。これは、そのまま2進数の表現になります。
┝━┥│ ││ │┝━┥│ │ │ ││ ││ ││ ││ │←真ん中の位置 │ │┝━┥│ ││ │┝━┥ └─┘└─┘└─┘└─┘└─┘ 1 0 0 1 0
そのため2進数は、コンピュータで取り扱うのに便利な数え方になります。
そして、プログラムでは、コンピュータの内部の動きを制御するので、必然的に2進数に触れることになります。
また、人間が10進数を使うのは、手の指が10本だという理由が大きかったりします。郷に入っては郷に従えということで、コンピュータ相手には2進数で数を数えるというわけです。
ちなみに、世界初のコンピュータENIACは、10進数を採用していたそうです。
サンプル
2進数の処理を、JavaScriptで簡単に書いてみます。
<html> <head> <title>「2進数」のサンプル</title> </head> <body> <pre><script type="text/javascript"> document.writeln("10進数の0~100を2進数で表わす\n"); for (var i = 0; i <= 100; i ++) { document.writeln( form(i, 3) + " - " + form(i.toString(2), 7) ); } document.writeln("\n\n2進数を10進数で表わす\n"); for (var i = 0, s = "1"; i < 10; i ++, s += "1") { document.writeln( form(s, 10) + " - " + form(parseInt(s, 2), 4) ); } // 桁揃え用関数 function form(s, n) { if (String(s).length < n) { s = form(" " + s, n); } return s; } </script></pre> </body> </html>
10進数の0~100を2進数で表わす 0 : 0 1 : 1 2 : 10 3 : 11 4 : 100 5 : 101 6 : 110 7 : 111 8 : 1000 9 : 1001 10 : 1010 ~~省略~~ 95 : 1011111 96 : 1100000 97 : 1100001 98 : 1100010 99 : 1100011 100 : 1100100 2進数を10進数で表わす 1 : 1 11 : 3 111 : 7 1111 : 15 11111 : 31 111111 : 63 1111111 : 127 11111111 : 255 111111111 : 511 1111111111 : 1023