0ベースと1ベース
日常生活で数を数える時は1、2、3と数えますが、Javaは最初のものを0として0、1、2と数えます。もう少し丁寧に説明してみましょう。待ち人の行列がありそれを先頭から見ていく様子を想像してください。
- 一番最初に先頭の人のいる位置に立つ。
- その場所を基点として位置を0とする。
- 先頭の人の位置は0である。
- 次に移動する。1つ移動したので位置に1をたして1とする。
- そこには先頭の人の1つ後ろの人がいる。この人の位置は1である。
- 次に移動する。1つ移動したので位置に1をたして2とする。
- そこには先頭の人の2つ後ろの人がいる。この人の位置は2である。
行列の中の人 | 位置 |
---|---|
先頭の人 | 0 |
その次の人 | 1 |
その次の人 | 2 |
Javaのものの数え方はこのような数え方に近いのです。最初のものを0とする数え方を0ベース、1とする数え方を1ベースと呼びます。「物事を最初からやり直す」こともゼロベースといいますがここでは深く追求しないようにします。
とはいえ0ベースに違和感があるという人もいると思います。最初は1番目でその次が2番目という考え方の方が自然に感じる気がします。しかし日常には意外と0ベースのものがあります。少し探してみます。
年齢
生まれた時は0歳です。そして1年経つと1歳、2年経つと2歳となります。これは立派な0ベースです。1年経つまではつまり365日経つまでは例え生後364日たっても0歳です。
一方日本には古来数え年という年齢の表し方がありました。これは生まれた瞬間は1歳とします。そして元旦を迎えると1つ歳をとります。なので誕生日と歳をとる日が違うのです。みんな一緒に歳をとるという感覚は慣れないと違和感があります。ちなみに大晦日に生まれると生後1日で元旦を迎え2歳になります。元旦に生まれた人は2歳になるまでに365日待ちます。ちょっと変わり種であるものの一応1ベースの仲間でしょう。
建物の階数
日本では地上階を1階、一つ上を2階と言います。これは1ベースです。
一方イギリスではフランスでは別な数え方をします。地上階をそのまま「地上階」(英:ground floor、仏:rez-de-chaussée)と呼びます。そして一つ上つまり日本での2階を「1番目の階」、日本での3階を「2番目の階」と呼びます。つまりこれらの国では階を0ベースで数えているのです。
変な感じもしますがある意味では理にかなってます。つまり地上階は0階ということで階段を上る必要のない階だとわかります。「1番目の階」に行くには0階から階段を1階分のぼるわけですし「2番目の階」は2階分のぼることがわかります。
時間や距離
時計の数字は12と書いてありますが12時は0時と同じです。1日の始まりは夜中の0時0分から始まります。例えば午前10時というと夜中の午前0時から10時間経ったことがわかります。
また距離もスタート地点を0と数えます。100メートル移動したらそこは100メートル地点です。
1ベースのためわかりにくい例
今度は1ベースで違和感がある例を出します。もうだいぶ経ってしまいましたが20世紀が終わり21世紀になるころのことでした。西暦は年齢とは違い最初の年を西暦元年つまり西暦1年とします。最初の世紀つまり1世紀は西暦1年から100年まで、2世紀は101年から200年までとなっています。
この数え方でいくと20世紀は1901年から2000年まで、21世紀は2001年から始まることになります。
ところが1999年の年末は大騒ぎでした。西暦の年が1の位から1000の位まで全部にひっくり返るわけですからなんとなくワクワクしてしまうのでしょう。それにコンピュータの2000年問題というのもありました。年を二桁でしか数えていないコンピュータのシステムは2000年になると数字が溢れてしまうという心配から来たものでした。
でも1999年の年末から2000年の元旦になるというのは「西暦が始まってから1999年が経った」という意味でしかないのです。これが1ベースの持つ罠です。
2000年から2001年になる時は前年より盛り上がらなかった覚えがあります、「西暦が始まってから2000年が過ぎ去った」記念の瞬間であったはずですが。
0ベースの意味
0ベースとはまず先頭が原点に存在しているという考え方が根底にあります。そして原点を0としてそこから移動した時だけ数字を増やします。
例えば10個の数字を数えようとすると0から始まり9で終わります。数えた数字の全てが1桁でした。100個の数字を数えようとすると0から99までで全ての数字が2桁に収まります。
コンピュータ上にメモリを確保する場合これは確保する量が少なくて済みます。もし1ベースで1から100とすると100個の数字のうちたった一つの数字100のためにメモリのスペースを3桁分用意しなければいけません。この3桁めの領域は1から99までの数字では必要のないものです。
実際にはコンピュータは10進数ではなく2進数で数えますのでこの例は正確ではありませんが0ベースにより使うメモリが少なくて済むという考え方は共通です。
長くなりましたのでJavaのソースコードで数字を数える例を出すのはまた次の機会にします。