星にゃーんのブログ

ほとんど無害。

2進数も16進数も10進数

コンピュータに詳しい人は、しばしば1024とか65536みたいなへんてこな偶数を指して「キリが良い」という。

なぜかと言えば簡単なことで、1024は2進数で書くと0b10000000000で、16進数だと0x400になるからだ。 「0b」と「0x」はそれぞれ、続く数字が2進数(Binary)、16進数(heXadecimal)であることを表す。

コンピュータの中では2進数や16進数をよく使うから、こういう数字は「キリが良い」。 ゲームでレベルが255でカンストしたり、どんなにがんばってもダメージが65535を越えなかったりするのも、数値の最大の桁数を2進数や16進数で考えて決めてるからだ。

困ったことに、桁数の扱いを間違えると1 - 2 = 255みたいな不思議な計算が行われる。 これはオーバーフローと呼ばれる典型的なバグの一種で、温厚な性格のAIが突然ブチギレて周囲に喧嘩を売りまくるみたいなことが起きる。 「シヴィライゼーション」の有名なバグ「核ガンジー」がまさにこれだ。


2進数が3進数や42進数を差し置いてここまでみんなに愛されているのは、コンピュータが2進数をベースに作られているからだろう。 0と1をスイッチのONとOFFに割り当てれば、大量のスイッチを高速でパチパチする機械を作れば計算ができる。 このスイッチの化け物が、友だちと話したり本を読んだりして暇を潰すのに最適な道具だとわかったのは、 間違いなくここ数十年の人類文明で最大の発見だ。

ところで、この2進数というのは機械が扱うには便利なのだが、人間が読み書きするとなるとかなり不便だ。 例えば、日本の人口はだいたい120,000,000人らしいが、これを2進数で書くと0b111_0010_0111_0000_1110_0000_0000となる。 4桁ごとに_を挟んで読みやすくしてはみたが、桁数が大きすぎて紙に書くのも大変そうだ。

そこで登場するのが16進数である。 16進数は、2進数との相互変換がとても簡単だ。 2進数を4桁ごとに区切って、4桁ごとに16進数の1桁へ変換すればいい。逆もすぐにできる。慣れれば暗算できるほどだ。 そして、人間にとっても読み書きしやすい。ちょっと慣れは必要だが。 そういうわけで、16進数は2進数を人間が扱うときに役立つ。

さっきの人口の例だと、こんな感じになる。

  • 10進数 120000000
  • 2進数 0b111001001110000111000000000
  • 16進数 0x7270E00


2進数や16進数は便利だが、10進数に慣れきった私たちは彼らのことを誤解しやすい。 特に、コンピュータと絡むとひどいことになる。

よくあるのは、例えばこんなCのプログラムの一行があるときに

int max_level = 0xFF;

「max_levelを16進数から10進数に変換したいんだけど、そんな関数ググってもでてこないんだよね。 10進数で書いた文字列に変換する関数は山ほど見つかったんだけど。」

彼がどんな誤解をしているか、わかるだろうか。

そりゃそうなのである。16進数だろうが10進数だろうが、数は変わらない。変わるのは数だけである。 16進数か10進数かが問題になるのは、人間が読み書きするときだけで、コンピュータは数値を扱っているだけだから、 「16進数を10進数に変換する」なんて処理はナンセンスだ。 (もちろん例外はある。気になる方は「二進化十進数」でググってみよう。)


こういう誤解が起こるのは、「2進数」という言葉の使い方に問題があるかもしれない。

〜数と名のつくものを考えてみよう。 自然数、整数、有理数、実数、複素数など、数の体系を表す言葉がたくさんある。

では、2進数も数の体系なのだろうか?いかにもそう思える。(これは同意を得られないかもしれない) しかし、そうではない。 「2進数」は、「2進記数法で書かれた数」であり、本質は「記数法」つまり書き方の話なのだ。


ここまで、知っている人にとってはあたりまえのことを書いてきた。 私自身、あたりまえだと思っている。

そして、同じくあたりまえでよくネタにされることについて書いて本稿を終える。

あなたはヒューマノイドタイプの宇宙人だ。アルファ・ケンタウリあたりに住んでおり、 板状の計算機械を用いて、惑星を覆う通信網を通してブログを読んだり動画を見たりしている。 そして、あなたは右手に8本の指を、左手にも8本の指を持っている。あなたにとってはあたりまえのことである。

さて、あなたは計算機科学の講義で計算に困ったことがない。 なぜならあなたは10進数を使っており、計算機も10進数を使うからだ。 正確には2進数らしいが、4桁ごとに区切って考えればいいだけだから問題はない。

ところが、少し困ったことがある。 太陽あたりに留学することになったのだが、その星では日常生活でA進数を使うらしいのだ。 なんてめんどくさいんだ。彼らはなぜ罰ゲームみたいな生活をしているのだろうか。 あっちにも計算機はあるんだから、10進数を使えば楽なのに。