東京大学きらら同好会

東京大学きらら同好会の公式ブログ

255 はとてもキリが良い数字である

アドベントカレンダー

この記事は東京大学きらら同好会 Advent Calendar 202218 日目の記事です。
昨日(17 日目)の記事は \mathrm{kn}1\mathrm{cht} さんの「【ブックレビュー】『川越の建物 蔵造り編』」でした!
明日(19 日目)の記事(?)は 500\,\mathrm{mL} 会長のぼざろ 1 ページ漫画です!楽しみですね!

こんにちは

おはようございます,こんばんは,一之瀬めろんです.この記事は会としての公式見解ではなく,私の勝手な見解です.念のため.

この記事ではいかに数字 255 がいかにキリが良いかについて語っていきます.とはいうもののキリの良し悪しなんてどうあがいても人の主観です.私は144 とか 3125 にキリの良さを感じますがどうせ 1234 とか 555 の方が好まれるんでしょ.知ってるよ.十進法に囚われた視野の狭い奴らめ...

部室 255

ステラのまほう」で主人公のたまちゃん達が所属する同好会「死んだ魚の目日照不足シャトルラン部」の部室は部室 255です.これのキリの良さは椎奈先輩が 441 ページ,たまちゃんが 981 ページでそれぞれ認めています.

この記事ではタイトル通り,255 という数字がいかにキリが良いかについて書いていきます.
全くもってキリの良さがわからない方にはキリの良さが伝わるように, 256 の方がキリが良いじゃないか派の方にはこれを読み終わっているころには 255 派に改宗するように書きましたので読んでいってくださいな.
既に 255 を十分キリが良いと思っている方は,ブラウザバック他のアドカレの記事も見ていってくださいな!

二進法

コンピュータは 01*1値を表したり計算したりしているというのはよく知られた話でしょうか.
十進法と二進法の値は以下の表のように対応しています.詳しくは高校数学の美しい物語とか読んでください.

十進法 二進法 十進法 二進法
1 1 9 1001
2 10 10 1010
3 11 11 1011
4 100 12 1100
5 101 13 1101
6 110 14 1110
7 111 15 1111
8 1000 16 10000

十進法の 255 は二進法で 11111111 です.キリが良いでしょう?

256

ここで記事を締めてもいいんですが,もうちょっとだけ続くんじゃ.というかここからが本番なんじゃ.

十進法の 255 は二進法で 11111111 です.1 が揃ってキリ良くなるのは,255=2^8-1 だからです.
しかし,2^8=256 (二進法では 100000000)の方がキリ良く見えませんか?
999(=10^3-1)1000(=10^3) なら後者の方がキリ良く見えるでしょう.

しかしながら,コンピュータの世界というコンテクストがあると,話が変わってきます.

コンピュータの世界

人間であれば大抵の場合,物を数えるときには 123\cdots と,1 から順番に数えます.人間の世界の「自然数」は 1 から始まります.
しかし,コンピュータの世界では,012\cdots と,0 から順番に数えます.コンピュータの世界の「自然数」は 0 から始まります.

2 つほど例を挙げましょう.

配列の index

ほとんど全てのプログラミング言語には,「配列」と呼ばれる(あるいは名称が違えど,相当する)機能があります.これは,たくさんの値をまとめて管理できる機能です.数列みたいなものを管理できます.

C,C++JavaRuby,Rust など,ほとんどのプログラミング言語*2は配列の要素を指定するときに 0 番目の要素,1番目の要素,\cdots と,0 から数え始めます.

例えば,C 言語では配列 a3 番目*3の要素を取得するのに a[3] と書きます.配列 a10 個の要素があるとき,それぞれの要素は a[0]a[1]a[2]\cdotsa[9] と指定します.

どうして 1 番目からでなく 0 番目から数え始めるのか.
歴史上の経緯というところもあります.C 言語が 0 から始まるので後発の言語が真似たというのもあります.しかし,便利だからこの仕様が多くの言語で採用されているというのもまた事実です.

ここにいかに便利か書いていた*4のですが,難しい話になってしまいますし私の力が及ばず簡潔に書くことができなかったので割愛します.興味があれば調べてください.

とりあえず,コンピュータの世界では基本的に 0 から数え始める,ということを伝えたいです.

整数型

コンピュータは 01 で値を管理したり表したりしてます.ですが 1 つ(1 桁)だけでは 01 しか表すことができないので使い物になりません.
そこで,いくつかの桁をまとめることで値を表しています.
コンピュータが 64 ビットだよ, 32 ビットだよ*5というのは,64 個の桁ごとにまとめて管理・計算するよ,32 個の桁ごとにまとめて管理・計算するよ,という意味です.

64 ビットでは,0 から 18446744073709551615(=2^{64}-1) まで *6 の値をいっぺんに扱えます.
32 ビットでは,0 から 4294967295(=2^{32}-1) までの値をいっぺんに扱えます.

ですが,こんなに大きい値を使う必要がないケースもあります.高々 100 くらいまでの値しか扱わないのに 64 ビットや 32 ビットも用いて値を管理するのはもったいないです.そこで,16 ビットや 8 ビットで値を管理する方法も様々なプログラミング言語でサポートされています*7

8 ビットでは,0 から 255 までの値をいっぺんに扱えます.
もし 1 から数え始めるなら扱える値の範囲が 1 から 256 となりますが,実際は 0 から数え始めるので範囲は 0 から 255 となります.
ここでようやく登場しました 2552558 ビットで扱える最大の整数なのです.キリが良い!
ファミコンとか古いゲームのステータスやレベルの上限が 255 だったりするのはこれが理由です.
しかも 8 桁全ての値が 1 です.8 桁中 8 桁が 1 です.8 桁中 8 桁が 0 である 0 の次くらいにキリが良いです.(8 ビットの話ですが)

2568 ビットで扱えない最初(最小)の整数です.ギリギリ扱えないというのはなんとも気持ち悪いものです.



というわけでして,人間の世界の数え方とコンピュータの世界の数え方が 1 ずれているので 256 よりも 255 の方がキリが良いのです.256 には 1001 のような微妙な気持ち悪さがあります.
しかしながらキリの良さなんて主観なので異論は認めます.実際きら同内部からもさっき異論が飛んできました.


おしまい.

*1:スイッチのオンオフとか,電圧の高低とか

*2:R や MATLAB などを除く

*3:4 個目

*4:メモリとかポインタの話を書きたかった

*5:もはやあまり見かけなくなりましたね

*6:符号付きの場合は省略します

*7:メモリ使用量は減るけど,内部では 64 ビットや 32 ビットで計算をしているので計算が早くなるかというと微妙