見出し画像

2進数

コンピューターは2進数で計算しているというのはよく聞く話です。
量子コンピューターはわかりませんが。

2進数で計算しているのは本当です。
僕たち10進数に慣れた人間からすると、2進数なんて効率が悪そうと思ってしまいますが、そんな事は無いのです。

コンピューターは電気で動くので、電気のオンオフを繰り返して、
電気信号が流れているのを1流れていないのを0と認識する2進数が一番効率が良いのです。

僕らの頃は2進数の計算を中学校で習いましたが、今は学校では教えないそうです。
ちょっと2進数を思い出して計算してみましよう。

10進数は0~9までの数字を使って1桁を表します。10になると桁が1つ上がっていくので、2桁目は10×10で100、3桁目は10×10×10で1000の位になります。
2進数も法則は同じです。
0~1までの数字を使って1桁を表します。2になると桁が1つ上がっていくので、2桁目は2×2で4、3桁目は2×2×2で8の位になります。

今日は2月6日なので、2と6を使って10進数の26を8桁の2進数で表すと、00011010 になります。
右から1の位、2の位、4の位、8の位、16の位 なので、16+8+2 で26を表しています。

じゃぁ26に3を足すとどうなるでしょうか。
3は2進数だと、00000011 ですね。

普通に筆算ができます。
 00011010
+00000011
ーーーーーー
 00011101

足して2になったら、隣の位に1を立てて自分を0にすればいいのです。ルールは10進数と同じですね。
右から倍々で位が上がっていきますので、16+8+4+1で29ですね。

ここまではいいとして、コンピューターは引き算ができません。
ありとあらゆる計算を足し算だけで行っているのです。
掛け算は足し算を何回も繰り返して求めています。
これはわかると思うのですが、では引き算はどうやっているのでしょうか。

さっきの足し算で求めた29から3を引いてみましょう。
引かれる側の29はそのまま2進数で表します。00011101ですね。

そして、引く側の数字を補数というものに変換します。
補数とは1と0を逆にして、1を足したものです。
???ですね。

じゃぁやってみましょう。3は00000011なので、1と0を逆転させて11111100になります。
これに1を足すと11111101になりますね。
これをさっきの29に足してみましょう。

 00011101
+11111101
ーーーーーー
 00011010

16の位と8の位と2の位に1が立っていますので、26になります。
29-3=26ですね。

上の計算だと、ほんとうは9桁目(256の位)が1になるはずですが、
ここでは8桁で計算していますので、オーバーフロー、いわゆる桁落ちして消えてしまいます。
不思議ですね。僕には理屈がよくわかりませんが、考えた人はすごいなと思います。

ちなみに割り算はどうやってるのかというと、割られる数から割る数をひたすら引き算して求めます。
ただし、実際は引き算はできないので、上で書いた足し算を繰り返して引き算と同じ結果を求めて、それを繰り返しているのです。

こういう恐ろしく効率の悪い事をコンピューターはやっているのですが、
それをあり得ない速さで繰り返すことができるので、29-3=と入力すると瞬時に26と返してくれるのです。

余談ですが、2進数1桁を1ビットと呼び、上の計算のように8桁だと8ビットで、これを1バイトと呼びます。
半角の英数字は1バイトで1文字を表します。
アルファベットのAはコンピューターの内部では、01000001になります。
漢字1文字を表すのには2バイト必要です。
1024バイト(アルファベットで1024文字分)で1キロバイト、1024キロバイトで1メガバイト、1024メガバイトで1ギガバイトと呼びます。
つまり1ギガバイトは1,073,741,824バイト、10億文字分以上なのです。

よくスマホを使い過ぎてギガが~と騒いでいる人がいますが、これだけのデータを使っているんですね。
ざっくり計算して、文字数にするとこの記事3万本ぐらいのデータ量です。
読むのにどれだけかかるんだ?
1ギガって凄い量ですよね。

というわけで、2進数のお話でした。

この記事が気に入ったらサポートをしてみませんか?