なんと言っても基本が大事。小手先だけの技術ではなく、10年戦える技術を身につけたい。
カテゴリー:コンピュータ
メールマガジン
2進数
基本情報の教科書を見ると、一番最初に出てくるのが、この2進数ですね。
2進数はコンピュータを設計する人にとっては、まさに必須なものなのですが、プログラマの中には無用という人も少なからずいるようです。
確かに、プログラム上で2進数を直接扱う機会は多くありません。
しかしながら、浮動小数型における循環小数など、2進数特有の特徴もあったりするので、知らないと分かりにくい罠にはまることもあります。
計算は面倒くさいものですが、まあこういうものなのだと割り切って、コンピュータの気持ちを少し理解してあげようではありませんか。
我々の世界では、数字と言えば10進数です。
10ごとに位(くらい)が繰り上がるので、このように呼ばれています。
一方、コンピュータの世界では、2進数を使っています。
なぜか?
それは、電気や磁気といった科学的な現象を利用しているコンピュータの世界では、2つしか値が無いというシンプルな表現方式の方が、扱いやすいからです。
ちょうどタイムリーに、コン基礎の教え方の宝庫(1) 2進数の手ほどきという記事がITProにありましたので、引用したいと思います。
いきなり「0と1だけで数を表すのが2進数です」なんて話をしたら、新人さんたちはとまどうでしょう。なぜ2進数を学ぶのか説明してから、様々な2進数の仕組を教えるべきです。私は、こんな風に説明しています。
- コンピュータは、そもそも計算機として開発された。
- 文字や画像など、本来数値でない情報を数値に置き換えて表すアイディアが生まれ、それによってコンピュータが、ただの計算機から万能の情報処理マシンになった。
- 電気で数値を表すのに10進数を使うのは困難である。たとえば、1本の電線で10進数の1桁を伝えるために、電圧を0V~9Vと細かく制御するのは困難である。
- そこで、1本の電線で電圧の有無だけを伝えることにした。これなら容易である。電圧無しを0、電圧有りを1とするのだ。1桁が0と1だけというのは、2進数である。
- コンピュータの内部では、2進数で情報が取り扱われている。だから、コンピュータの仕組を理解するには、2進数を学ぶ必要があるのだ。現在のパソコンは、32本の電線を使って32桁の2進数を取り扱っている。
さすがは矢沢さん、とても分かりやすいと言いたいところですが、一つだけ間違いがありました。
そこで、1本の電線で電圧の有無だけを伝えることにした。これなら容易である。電圧無しを0、電圧有りを1とするのだ。1桁が0と1だけというのは、2進数である。
という部分ですね。
電圧無しを0としてしまうと、0だから電圧が無いのか、データが無いから電圧が無いのか、どこかに故障があるから電圧が無いのか、判断付かなくなってしまいます。
そこで、ケーブルに信号を流すときは、波形でもって1と0を表現するようにしています。
LANケーブルを例にすると、0と1は波形が上下逆であり、またプラスとマイナスに流れる電圧が同じになるように工夫されています。そうすることで、異常も検出しやすくしています。
矢沢さんの例に無い2進数を他に挙げると、スイッチのオン・オフ、磁界の向きなどもあります。
電圧のあるなしで言えば、コンデンサも2値を示すことができます。
10進数のときは、1の位、10の位、100の位...というように位を数えます。
2進数では、1の位、2の位、4の位、8の位...となりますが、なんだか覚えにくいですね。
この覚えにくさが、2進数の覚えにくさなのだと、私は考えています。
そこで、位とは何か考えてみましょう。
小学校の頃、位というものを習ったときは、1の位、10の位、100の位...と教えられましたが、ここで正体を明かしたいと思います。
その正体とは、
1の位 → 100の位
10の位 → 101の位
100の位 → 102の位
1000の位 → 103の位
なのです。
つまり、10の何乗なのかで表現され、指数部は位が上がるごとに、0から1ずつ増えているだけです。
このときの10を基数と言います。
基数が10の数を10進数、2の数を2進数、8の数を8進数、16の数なら16進数となります。
従って、2進数の場合だと、
1の位 → 20の位
2の位 → 21の位
4の位 → 22の位
8の位 → 23の位
16の位 → 24の位
ということになります。
位が増えるごとに、基数にあたる2を掛けていけばよいのです。
2進数から10進数に変換したい場合は、
位を表す数とその値を掛けたものを、全て足していけばいいです。
例えば、1010 なら
1×8 + 0×4 + 1×2 + 0×1 = 10
となります。
または、
1×23 + 0×22 + 1×21 + 0×20 = 10
と表現してもいいですね。