Rubyでプログラミング入門 RSSフィード

2006-10-30

[]基数変換とか

基数

さて、何やらさらりと“基数”という言葉が出てきています。

一般的な用語といえばそうなのですが、聞いたこともないという方も居そうなので補足します。

まずは用語辞典をひいてみましょう。

基数 【radix

数値を表現する際に、各桁の重み付けの基本となる数。我々が普段している10進数では、10倍ごとに桁が上がっていくので、基数は10である。2進数、8進数、10進数、16進数の基数はそれぞれ2、8、10、16である。

読めばなんとなくわかりますね。別段難しいことではないようです。

それでは、この基数を相互に変換することを考えてみます。


位取り記数法

基数を変換する――というだけでは少々曖昧な気もするので、その前に知っておきたいことがあります。

それが、“位取り記数法”という名称です。

位取り記数法

位取り記数法(くらいどりきすうほう)は、数の表現方法の一種で、適当な自然数 N >1を指定して N 種類の記号(数字)を用意し、それを列べることによって数を表すための規則である。

位取り記数法で指定された自然数 N をこの記数法の基数といい、基数が N であるような位取り記数法を「N 進法」「N 進記数法」という。N 進法では、N 種類の数字からなる記号列において、隣り合う上位の桁に下位の桁の N 倍の意味を持たせる位取りによって数を表現する。

とまぁ小難しくかいてありますが、実はなんのことはなくて、普段普通の人がアラビア数字を使って数値を表記している場合、この“位取り記数法”という表現方法を用いています。

要するに普通の書き方、です。そんな説明でいいのかわかりませんが。

そして、先ほど調べた“基数”についても改めて解説されています。

このあたりを踏まえると、普段我々が使っている数の表記法は『基数を10とした位取り記数法』である、ということなのだと思います。

そして、この位取り記数法のなかで基数を別の数にすること――これが、“基数変換”になります。


10進数ってなんなのか

位取り記数法を意識したうえで、慣れ親しんだ10進数について見直してみます。

たとえば、次のような数値があります。

1234

なんの変哲もありません。「この数値はなに?」と尋ねられれば、「せんにひゃくさんじゅうよん」と問題なく答えて頂けるでしょう。

実はこの「せんにひゃくさんじゅうよん」という読み方がちょっとしたポイントだったりします。

このように数字同士をくっつけて表記し、さらに「数値」は何か、と聞かれた場合に「いちにぃさんよん」と答える方は……たまにしか居ません(と思います)。


しかし、確かに数字をひとつひとつ分解すれば、単に「1と2と3と4」が順番に並んでいるに過ぎません。

にも関わらず、自然に頭の中では「これはせんにひゃくさんじゅうよんだろ……」と解釈されているはずです。

このとき、「1と2と3と4」は額面どおりの値ではありません。

「1→実は千」であり、「2→実は二百」「3→実は三十」「4→実はも何も四」という風に各数字に対して、「ある計算」が施されてしまっています。

このとき、どのようなルールに則って計算されているのかというと、

ある桁の数字の値 × {10の(桁 − 1)乗}

という計算です。

たとえば先ほどの「1234」における「2」とは、

2 × {10^(3 − 1)}
→ 2 × 100
→ 200

という計算から、実は「二百」という数値であることがわかります。

当たり前といえば当たり前すぎる話ですが、このときに掛けられる『10の(桁 − 1)乗』のことを、各桁の“重み”といいます。

これは、位取り記数法の裏に隠されている暗黙の値です。

では、なぜこの値は『10の(桁 − 1)乗』になるのでしょうか。

それはいうまでもなく10進数は10個の集まりで一桁繰り上がるから、です。

ということは、もしも

1234

が実は10進数ではなく16進数だったとしたら、各桁の値には『16の(桁 − 1)乗』が掛かることになるわけです。

というわけで実際に計算してみると、

1234(16) → 1 × {16~(4 - 1)} + 2 × {16^(3 - 1)} + 3 × {16^(2 - 1)} + 4 × {16^(1 - 1)}
         → 1 × 4096 + 2 × 256 + 3 × 16 + 4 × 1
         → 4096 + 512 + 48 + 4
         → 4660

という具合です。

そして実はこれこそが、N進数から10進数への基数変換のやり方になります。

N進数の各桁には『Nの(桁 − 1)乗』の重みがかかりますので、そこだけうまく置き換えて同じように計算するだけで10進数への変換は楽々できてしまいます。

慣れれば簡単なので、経験のない方は2進・8進・16進あたりから10進に変換する練習をしておくといつか役に立つかもしれません。少なくとも、基本情報処理などの資格取得には役立つと思いますw

検算には、Googleの電卓機能(http://www.google.com/help/calculator.html)を使ったり、[ファイル名を指定して実行]で「calc」として、関数電卓を利用すると良いですね。


10進数以外への変換は、また別の機会に書きます。


因みに、こういう話題に興味を持ったぜ、という方には『Write Great Code』という書籍が個人的にはおすすめです。

まつもとさん繋がり、というあたりも重要です。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/mailishmaid/20061030/1162209213