プログラミングってIFとかCASEでしょ?
なんで2進数が出てくるんだ?
結局コンピュータが理解できるのは2進数だけなんだ。
だからコンピュータの基礎を学ぶために2進数を学ぶのだ。
はじめに
プログラミングを勉強しはじめて、初心者が特に最初につまづきやすいのが「2進数」についての話です。
いきなり0とか1とか2進数が出てきたり、中には8進数や16進数なんてものの登場し、ビットとバイトの違いもよく分からず、研修が終わるころにはすっかり記憶のかなたへ。
そんな経験をする人が多いと思います。
正直言うと、理解していなくてもプログラミングはできるし仕事もできます。
なのでここでつまづいても講師は何も言わないし、(下手すると講師も理解していないかも、、)
研修がそのまま進んでしまいます。
この記事ではモヤモヤしたまま進みたくない!って思っている、エンジニアとしての素質が高い皆さんのために、あえて飛ばしがちな内容について詳しく説明していきます。
コンピュータとラジコンカーの違い
皆さんに質問です。
「コンピュータは何で動いているのでしょう?」
このように聞かれたとき、なんて答えますか?
「コンピュータはプログラムで動いている!」
「いや、メモリやCPUなどの電子部品と回路だ!」
「愛と希望さ!」
考え方は様々だと思いますが、意外と見落としがちな肝心なものがあります。
「コンピュータは、電気で動いている」
え?と思うかもしれません。
コンセントを抜いてしまったり、バッテリーが無くなると
パソコンは動かなくなってしまいますね。
何を当たり前なことを言っているのだと、機械に電気はもちろん必要だろと、そう考えていると思います。
しかし、電池を入れて走るラジコンと、電気で動くコンピュータは別物です。
なぜなら、ラジコンの電気はモーターを動かすためのもので、コンピュータの電気は情報として入出力、保存、演算処理を行っているのです。
電気→デジタル信号→0/1
コンピュータはおおざっぱ?
コンピュータの中には電子部品、基盤、回路がたくさんあります。
そしてコンピュータは精密機器のくせして、意外とおおざっぱなのです。
なので基本的にコンピュータは電気が「流れている」のか、もしくは「流れていない」のかの二つしか区別できません!
なぜコンピュータはおおざっぱなのか疑問に思うかもしれません。
では皆さんここで、家の中にあるアナログ時計を探してください。
デジタル時計ではなく、アナログ時計です。
ありましたか?
では今何時何分の、何秒か正確に答えられますか?
数字と数字の間にあったのであれば、正確な秒数は分かりません。
もし秒針がちょうど数字のところを指していたとしても、コンマ何秒まで正確に答えるのは難しいでしょう。
ちなみにこれが、アナログとデジタルの違いです。
コンピュータは正確?
話を戻しますと、コンピュータは電気が流れているかどうかしか区別しません。
二つしか区別しないから、コンピュータは正確なのです。
おおざっぱなのに正確とはどういうことか。
もし電気を正確に測定するコンピュータがあったとします。
実は電流は完ぺきな一定量の出力はできません。
僅かにブレが生じてしまいます。
その誤差を正確に測定できるコンピュータが全て検知しました。
すると、コンピュータの中に保存していたデータが、検知するたび情報が変わってしまいました!
しかも冬場になると静電気でデータが勝手に増えたり、電子レンジを使うと自動でプログラムが実行されたり、外部の影響も正確に検知してしまって滅茶苦茶です!
はい、もちろん普通のコンピュータは静電気対策していますし、電子レンジの影響もありません。
しかし正確に計測しようとすると正しく情報を取得できなくなってしまうため、あえておおざっぱに計測して、正確な情報を取得するのがデジタルの力なのです。
ここでもう気づいたと思いますが、つまり電気が流れているか流れていないかのON/OFFが、コンピュータが理解できる情報、0と1ということになります。
0と1だけで何が分かるのか
人間も2進数で会話できる
さて、コンピュータのプラグをコンセントに差し込んで、電気を流し込むことでようやくコンピュータは0と1の二つの情報を理解できました。
「たった二つの情報だけで何ができるんだ!」
001011101011010101010101111010000111
0と1だけで文章を書こうとすると、こんな風になってしまいますね。
実は現実世界でも、二つの情報だけで会話できる人たちがいるのをご存知でしょうか。
そう、「モールス信号」です。
モールス信号は「・(トン)」と「-(ツー)」の二つの信号だけで会話、つまり情報を相手に伝えることができます。
お互いが共通のモールス信号のルールを知っているから、受け取った情報を文字に変換して通信することができるのです。
2進数で数字(10進数)を表す
人間は手の指が10本なので10進数を使います。
右手の親指から左手の小指まで数字を一つずつ割り振るなら、0、1、2、3、4、5、6、7、8、9と重複なくできますね。
(0も数字ですよ! ここでは数を数えているのではなく、ただ数字を記号として使っているだけと考えてください)
例えば二人組で、相手に「4の指」と聞いたら、相手が「右手薬指!」と答えてくれる感じです。
ではもし、0と1の二つの数字(=記号)だけ使って、指を一つ一つ区別するとしたらどうしますか?
二つしか使えないのだから指二本しか区別できない、そんなことはありません!
10進数で数字を10個しか使えなくても、皆さんは10以上の数字を数えることができますね。
そう、桁を増やすのです。
先ほどの例で考えるなら、右手親指と人差し指までは、「0」「1」と識別できます。
次の右手中指、薬指、小指は桁を増やして、「10」「11」「100」とします。
また二人組になって、相手に「11の指」と伝えたら、相手はすぐに「右手薬指!」と認識することができます。
10進数の相手には「4の指」、2進数の相手には「11の指」と伝えたとしても、実際は同じ右手薬指を指し示しているということです。
(「こんにちは」でも「hello」でも意味は同じ、みたいな感じですかね)
さいごに
数字はあくまでただの記号だと考えてください。
人間の手の指の一本一本にラベルをつけようと、0~9という記号を人間が発明したものと思ってください。
しかし世の中には人間の手の指の数より多いものはたくさんあります。
なので桁を増やすことで人間は数を数えられるようにしているのです。
ではコンピュータはどうでしょうか?
2進数を使うコンピュータも同じです。
桁を増やせばもっと大きい数を数えることができます。
この話はまたビットとかバイトの話になるのですが、今回はここまで。