#130 番号付けの流儀

2000/08/15

<前目次次>


 複数あるものに通し番号を付ける際に、あなたはどのような流儀(スタイル)を取っているだろうか。

 一つには、普通に1,2,3,…10,11,…99,100,101…という具合に、単に数字をそのままの桁で表す方法を取るか、あるいは、あらかじめ桁数を決めて001,002…,010,011,…099,100,101…という具合に、上位の桁に0を埋める方法を取るか、という問題がある。

 通常の世界では、前者の方法で何等差し支えがないし、むしろ後者のような方法は不自然だと考える向きも多いかと思う。しかしコンピュータの場合は、後者の方法を取る方が都合が良い場面が多い。

 その理由の一つとして、並べ変え(ソート)をした時に、数字の列と並び順が一致しないということがある。並べ変えの時には、多くの場合文字コード順を基準に行われることが多い。文字コードによるソートの場合は、先頭から文字を比較し、その文字のコードの大小で並び順を判断し、もし同じ文字ならば、次の文字のコードを比較する、といった方法で順番を決定する。数字の文字コードについては、どのコード体系においても0,1,2,3…8,9の順に並んでいるが、もしも上位の桁が埋まっていない場合は、桁数の違う数字が混ざっていると、違う桁を比較されることになってしまう。

 そうすると、例えば 1,2,4,8,16,32,64,128 をコード順で並べ変えた時に、その順序は、1,128,16,2,32,4,64,8 という具合になってしまい、数字の大小順と一致しない。もし上位の桁に0を埋めていれば、コードによる並び順も001,002,004,008,016,032,064,128となり、数字の大小順に一致する。

 もちろん、上位桁が埋められていない普通の数字を正しく大小順に並べ変えなければならない場面も多いため、例えばUNIXのコマンドの sort では、-n オプションをつけることによって、並び順を数字の大小順で評価してくれるようになる。しかし、前後に数字以外の文字が接続している場合には、数字が開始されるカラムの指定も必要になり、面倒である。それならば最初から桁数を規定して0を埋める方法を取った方が余計なことを考えなくてすむ、ということもある。

 また当然のことながら、桁数がばらばらだと列挙した時に幅が一定にならずに、見た目に美しくない、ということもある。あらかじめ桁数を決めて上位桁に0を埋めれば、とりあえず幅が一緒になって並びが綺麗に見える。もっともこれは好みの問題だし、等幅フォントではなくプロポーショナルフォントを使った場合には、表示幅を揃えようなどと思うこと自体意味がないのだが。

 そういう次第で、例えばプログラミング言語の場合でも、数字を出力する際には、場合に応じて様々なフォーマットが用意されている。例えばC言語の場合、printf関数群で整数を出力するフォーマットは%dだが、桁数を規定して%8dなどとすると、8文字分の幅に数字を右詰めで表示し、上位桁の部分には空白が埋められる。更に%08dなどとすると、空白のかわりに0を埋めてくれるようになる。

 ちなみにこの「電脳」の場合、日付の表示は2000/08/04などのように0を詰めて表示しているし、ファイル名は0埋めの3桁で表している。3桁にしたのは「いくらなんでも999話まではいかんだろう」という見通しからなのだが、果たしてどうであろうか。

 もう一つ、序数を表す際に、0から始めるか1から始めるかという問題がある。前者の場合は、要素の数は最後の番号+1となり、後者の場合は、要素の数と最後の番号とが一致する。

 日常生活においては後者の方が一般的であろう。日付を表す場合だって、元日は1月1日だし、西暦だって1年からスタートしている。(だから2000年は20世紀なのだ。)しかし時刻の場合は、24時間制の場合は0時,1時…,23時と言うけども、12時間制だと「12時」というのは当たり前に使っている。だから「午前12時」というのが正午なのか深夜なのか判然としないということも起こる。

 プログラミング言語の場合、配列の添字について1を基点にするもの(FORTRANなど)と、0を基点にするもの(Cなど)がある。どちらの言語を選択するかによって、プログラムの設計やアルゴリズム、そしてさらにはそのプログラマの数の考え方扱い方までもが決められていくような気がする。

 ちなみに私の場合、最近ではPerlを使うことが多いため(Perlの配列のデフォルトは0基点である)自然に0を基準に考えることが多い。ちなみに腕時計の時刻表示も24時間制にしている。「プログラマと腕時計の時刻表示」について相関を調べたら、結構面白い結果が出たりして。夏休みの自由研究としていいテーマだと思うのだが(どこがやねん)。


<前目次次>