基数変換とか

基数

さて、何やらさらりと“基数”という言葉が出てきています。
一般的な用語といえばそうなのですが、聞いたこともないという方も居そうなので補足します。
まずは用語辞典をひいてみましょう。

基数 【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』という書籍が個人的にはおすすめです。
まつもとさん繋がり、というあたりも重要です。

Write Great Code〈Vol.1〉ハードウェアを知り、ソフトウェアを書く

Write Great Code〈Vol.1〉ハードウェアを知り、ソフトウェアを書く