2進数と16進数

こんにちは、ひろです。

 

さて、前回、私のブログの記念すべき第一回目の記事は、なんと2進数のお話というなかなかに謎な滑り出しを見せましたが、果たして今回はどうなるのでしょうか。

 

残念ながら今回も2進数のお話です。

あと16進数も出てきます。

 

 

 

前回の記事を読み直して、「内容うっす!」と思わず素で叫んでしまったので、今回はもう少し詳しく2進数についてのお話をしたいと存じます。

今回の記事も、あんまり2進数とか普段触れない人が読むとちょっと面白いかもしれませんが、2進数についてよく知っている人なら当たり前の内容です。

では早速参りましょう。

 

 

まず、2進数で数をどう表記するのかについてお話していませんでしたので、そこから始めたいと思います。

2進数で、0はどう書くでしょう?

 

0

 

0は「0」の文字をそのまま使えるので、こうなります。簡単ですね。

では、1は?

 

1

 

これも「1」の文字をそのまま使って表記します。

問題は次です。「0」「1」のふたつの文字しか使えない二進数で、「2」はどうやって表現するのでしょうか?

簡単です。2桁にすればよいのです。

 

10

 

「え!?もう2桁になるの?」

はい、2進数では、2という小さな数を表現するときに、既に数字を二けたにしないとなりません。

 

これは非常に不便ですが、賢い人はこれを上手く表記する方法を考え出しました。

16進数です。

実は、2進数と16進数は相性がすごくいいです。

このことを証明するために、Web上で簡単にできる占い(http://uranai-renai.com/aisyo/aisyo2.php)で、二人の相性を占ってみました。

 

f:id:hiro_gomafu:20180201211242p:plain

 

マジで相性よくてビックリした当然の結果ですね。

 

 

 

・・・え?なんか画数にerrorとか出てるし納得できない?

OK、では具体的にどう相性がいいのかご説明いたしましょう。

まず、4桁の2進数を考えます。

 

0000 0001 0010 0011

0100 0101 0110 0111

1000 1001 1010 1011

1100 1101 1110 1111

 

16進数では、これら4桁の2進数をすべて1桁で表現できます。

これがどういうことかといいますと、2進数と16進数を相互に変換する時に、ものすごく便利なのです。

上の16個の2進数に、16進数を併記してみましょう。

 

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

 

この表があれば、2進数と16進数の変換が一瞬でできます。

例えば、次のようにクソ長い2進数があったとします。

 

1000101000101000101000001100100011001100000010000

 

このままではとても見づらいですし、ゼロやイチがいくつ連続して並んでいるのかなど、非常に紛らわしいですね。

これを16進数に変換してみましょう。

まず、下の位から、4桁ずつにこの16進数を区切ります。

 

1 0001 0100 0101 0001 0100 0001 1001 0001 1001 1000 0001 0000

 

あとは、先ほどの2進数と16進数の併記に従って、各4桁を16進数に機械的に変換するだけです。

 

1145141919810

 

非常に美しく、覚えやすくなりました。

16進数から10進数に戻すときも同様に、さきほどの表で機械的に戻すことができます。

 

もうお分かりですね、16進数は、2進数を人間が視認しやすい形に書き換えたものだったのです。

今までカラーコードなどで何となく16進数に触れていた人も、なぜ16という中途半端な数字なのか?という疑問がスッキリ解決できたのではないかと思います。

 

ちなみに、前回の記事の話でちょこっと出てきたポケモン個体値の話がありましたが、個体値が0~31なのも、2進数5桁で表現できるのが0~31までだからという理由に起因しています。

さらに言いますと、努力値の最大が255なのも、2進数8桁で表現できる最大値が255だからです。

初代のポケモンなどは、カセットに詰め込めるゼロとイチの量(桁数)がカッツカツだったので、個体値努力値に割り振る桁数を慎重に決めた結果、必然的にその最大値が決まったのですね。

同じように、多くのゲームでダメージのカンスト値などが「(2^n)-1」であることが多いのはその影響です。32767((2^15)-1)とか65535((2^16)-1)とか、ゲームをやり込んだ人なら見慣れた数字ではないでしょうか。

 

 

 

さて、前回に引き続き、2進数の話や、それを人間が分かりやすいように書き換えた16進数の話などをしましたが、いかがだったでしょうか。

次回は・・・うーん、もう2進数の話は流石にいいよね。

なんか別の話考えときます。

では。

 

俺は一体このブログで何がしたいんだろう

2進数のお話

なんか周囲で何人かがブログを始めたみたいなので私も始めることにしました。

 

記念すべき初回は、2進数についてお話しようと思います。

え?脈略がなさすぎるって?

 

いいから聞けよ。

 

みなさんは、2進数をご存知でしょうか?

「名前だけは聞いたことがある」「中学(高校)で勉強したことがある」「仕事で毎日触れている」「昨日の夕食に出てきた」

様々な人がいると思います。

今からするお話は、特別専門的な話ではありません。

「2進数って言葉だけはよく聞くなぁ」くらいの人が読むと面白いかもしれませんが、2進数についてよく知ってる人にとっては当たり前の話です。

それでも良ければ、お付き合いくださいませ。

 

 

 

2進数のお話をする前に、まず進数とは何なのかをお話します。

進数とは、数値を表記するための記法(正確には進法と言うが、説明を簡単にするために進数と呼ぶ)のことです。

たとえば、我々が普段使っているのは、10進数です。

10進数では、数値を「0 1 2 3 4 5 6 7 8 9」の10個の文字で表現します。

では、2進数はどうでしょうか。

 

「0 1」

 

2進数はこのふたつの文字だけで数値を表現します。非常にクールですね。

一般的に、N個の文字で表現される数値の記法のことをN進数(正確にはN進法)と呼びます。

他にも、PCに詳しい人なら、16進数も聞いたことがあるかもしれません。

16進数では、0~9までの10個の記号に加えて、アルファベットのABCDEFの6つの文字を数値の表現に使用します。

最近はほとんどみなくなりましたが、かつては8進数なんてのもよく見られました。

ちなみに、ポケモン個体値におけるVとは、32進数における31を指しています。

個体値の最大値が31なので、32進数に直してVと呼んでいるのです(同様に、Uは30を指します)。

 

 

 

続いて、2進数ではどのように数字を表現するのかをお話します。

まずは、次の10進数をご覧ください。

 

1145141919810

 

地球上で最も美しいことでよく知られるこの数字ですが、この数字を2進数で表記すると次のようになります。

 

10000101010011111110001110000000001000010

 

桁数がドンと増えましたね。この2進数を見て、一瞬で「美しい数字だ」と思える人はバーチャルホモに違いありませんほぼ居ないでしょう。

 

 

 

さて、ここまでの話を聞くと、あなたは考えるでしょう

「2進数って扱いづらいわ」「10進数だけでええやん」

仰る通りです。

はい、ぶっちゃけ我々が自然界で生きていく上では、10進数だけで事足ります。

では次に、なぜ2進数が必要なのかについて、お話しましょう。

 

結論から述べますと、2進数はコンピュータが数値を扱う時に用います。

我々の手指が10本だから、10進数が我々にとって最も都合がよいのと同様に、コンピュータには電気が流れているか流れていないかの2つの状態があるので、2進数で数値を表現する方が都合がよいのです。

みなさんご存じの通り、コンピュータはゼロとイチだけですべての情報を処理しています。

 

あなたが読んでいるこの文章もゼロとイチからできてますし、あなたがこのページを開いているブラウザもゼロとイチで表現された機械語で動いています。

たった2つの文字だけで本当にそんなことができるのかとお思いかもしれませんが、このようなことをするために、コンピュータは何億、何十億というゼロとイチを読み続け、計算し続けています。

少し実感が湧くように、具体的にどれくらいの量のゼロとイチが処理されているのかを考えてみましょう。

以下の画像をご覧下さい。

 

f:id:hiro_gomafu:20180131165058j:plain

(出典:http://college2ch.blomaga.jp/articles/197288.html

 

宇宙で最も美しいことで有名なこの画像ですが、この画像のサイズを見てみましょう。

 

f:id:hiro_gomafu:20180131165438p:plain

 

4092バイトとなっていますね。

1バイトは、0か1が8個並んだものです。

1バイトの例:「00000000」「10101010」「10110110」「01101010」

つまり、先ほどの画像は、コンピュータ上では0と1が4092×8=32736個並んで表現されているということです。

これが大体どれくらいの量なのかというと、

 

f:id:hiro_gomafu:20180131170608p:plain

f:id:hiro_gomafu:20180131170618p:plain

f:id:hiro_gomafu:20180131170620p:plain

f:id:hiro_gomafu:20180131170621p:plain

f:id:hiro_gomafu:20180131170620p:plain

f:id:hiro_gomafu:20180131170620p:plain

f:id:hiro_gomafu:20180131170625p:plain

f:id:hiro_gomafu:20180131170623p:plain

f:id:hiro_gomafu:20180131170623p:plain

f:id:hiro_gomafu:20180131170627p:plain

 

これくらいです。

0と1が交互に3200個並んだ画像を10枚並べました。

このように、コンピュータ上に存在するすべてのデータはゼロとイチからできています。

 

2進数は、コンピュータ上で大活躍している、素晴らしい進数なのです。

 

 

 

さて、ここまで、2進数のお話を気の向くままに適当に述べてきましたが、如何だったでしょうか?

初めてのブログで、いきなり何の話をしてんだよって感じですが、まぁいいでしょう。

次回も、(気が向けば)2進数にまつわる話をもう少し続けて書こうかと思っています。

それではまた。