« Fedora7 | トップページ | 今日の早川さん »

2007年10月 9日 (火)

n進法(n進数)

n進法についてメモ。会社で後輩がCのコードを読みながら、「コンピュータって2進数なんですよね。ソースを見ると16進で書いてあったり10進数で書いたりしてて良く分らないんですけど。。」と悩んでいた。かつて自分も悩んだので、15分ばかり解説をしてみた。
そのあと寝ながらいろいろ考えたので、今回はその辺の話題をまとめて書いてみます。

■数を表現するということ
数値というものは、数直線で表現することができます。特に、整数に限って言えば、数直線上に1の距離毎に置かれた点で表現できます。無限に存在する整数は無限に長い数直線で表現されることになります。そして、任意の整数は、それに該当する数直線上の位置で表現することができます。つまり、255という3文字で表現されるある値を、数直線上のある点の位置で表現することもできるわけです。

"255"

等価

+----+----+----+- 略  -+----#----+----+----+
0

こんな感じ。

数直線上の位置として数値を表現する場合、n進法という問題は出てきません。数値は無限に長い数直線上の幾何学的な「位置」として表現されるので、「桁」という概念がそもそも存在しないからです。

そこから考えてみると、もし仮に、数値を表す記号が無限種類あれば、やはりn進法という問題は発生しません。すべての整数に対して別の記号が割り当てられるので、あらゆる整数が1桁で表現できるからです。しかし、現実には無限の記号を用意することはできませんし、用意できたとしてもそれを把握することは一生かかってもできません。

よくよく考えてみると、そもそもある「数値」を表現する形式は無数にあるということに気がつきます。255、二百五十五、0xff、two hundred and fifty five、11111111すべて同じ値です。255という数値のイデアがあって、それを表現する雑多な形式があるわけです。

僕ら日本人は生まれた時から日常生活で、ある数値のイデアを「にひゃくごじゅうご」という音で理解し、アラビア数字で255、漢数字で二百五十五と文字表現します。(ローマ数字だと??)これは10進法を元にした表現形式で、僕らは数値を10進法で表現することに慣れています。それは言うまでも無く指の数が10本だからですが。しかしあまりにも慣れすぎているため、数値というものは10進法という表現形式と不可分であると思いがちです。小学校で延々と足し算引き算掛け算割り算の訓練を10進法でやらされたのだから無理もありません。10進法で考えることを前提に算数の訓練をしたわけです。そこでいきなりn進法といわれても。。。

しかも、n進「数」という表現がこれまた誤解を招きます。まるで、2進数と10進数と16進数は、別の数の集合であるかのようです。そうではなく、ある「数」を表現する方法として、n進法という表現方法の一派があり、その中に、2進法とか10進法とかがあるわけです。なので、私はn進「法」という表現をした方が分りやすいと思うので、基本的にn進「法」という表現を(教育上の理由から)用います。
表現方法の一派と書きましたが、n進法以外にも、上記で書いたような「数直線上の点として表現する方法」もあるわけですし、コンピュータのように、「電気信号のon/offのbit列として表現する方法」(これは容易に2進法に読み替えられる)もあるわけです。

さらに言ってしまえば、僕らは10進法で考えることに慣れているといいましたが、日本語の数値表現は、厳密に言えば10進法ではありません。10進法とは、10個の記号を使ってすべての数値を表す技法ですが、日本語にはもっとたくさんの記号がありますし、ルールが一定していない部分もあります。
1           一
2           二
:
10          十
11        十一
:
20        二十
:
99      九十九
100         百
1000        千
2000      二千
10000     一万
100000    十万
1000000   百万
10000000一千万

すぐに気づくことは、10^1、10^2、10^3、10^4それぞれに対応する記号があることです。10進法では、その名に反して、10を表現する記号は存在しません。「1」と「0」を使って表現します。これは16進法においても同様で、一般に、n進法においては、0~n-1を表現するn個の記号が必要で、nを表現する記号は存在しません。n進法における「n」という数値はすべて「10」と表現されます。n進法という概念が理解しにくい理由のひとつは、そもそも自然言語での数値表現が、10進法に基づいていながら、しかし厳密には10進法ではないという点にあるのかも知れません。
さらに、良く見てみると、十や百や千の前には一が付かないのに、万の前には一が付きます。ところが一千万となると一が付きます。

ちょっと長くなったので、今日はココまで。

|

« Fedora7 | トップページ | 今日の早川さん »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/207693/16705909

この記事へのトラックバック一覧です: n進法(n進数):

« Fedora7 | トップページ | 今日の早川さん »