導入
質問された中で、自分では考えたことがなかったので、備忘録として書いておきます。
基数とは
n進数のnが基数です。
n進数とはある桁の数値がnになれば桁上がりするような数のことです。
我々は一般的には10進数を使います。
ダースは12進数ですし、週は7進数、分秒は60進数で時は24進数など以外といろいろなn進数が生活の中で使われています
コンピュータの世界では2進数を使いますし、2進数だと桁数が大きくなりやすいので、8進数や16進数もよく使います。
※8=2の3乗、16=2の4乗ということで、8進数/16進数の1桁は、2進数の3桁/4桁分をまとめて表現できるのです。
以降、n進数で表現された数値xyzについては下記の書式を用います。
xyz(n)
基数変換とは
値を変えずに基数を変換することです。
例えば100(10)の場合は下記のように変換可能です。
100(10) ⇔ 64(16) ⇔ 144(8) ⇔ 1100100(2)
桁の重み
よく基数変換の説明で出てくるのが桁の重みです。
2進数の場合は以下のように記載されていることが多いかと思います
2^6=64
↓ 2^4=16
↓ ↓ 2^2=4
↓ ↓ ↓ 2^0=1
↓ ↓ ↓ ↓
1 1 0 0 1 0 0(2)
↑ ↑ ↑
↑ ↑ 2^1=2
↑ 2^3=8
2^5=32
これを利用して、1100100(2)を10進数に変換すると下記の通り100(10)になります。
64×1 + 32×1 + 4×1 = 100
本題
前述の通り桁の重みを各桁にかけることで、n進数→10進数の変換が出来ます。
しかし、なぜ10進数になるのかが分からないといわれたのです。
考えたことがなかったので、即答できなかったのですが、よく考えれば簡単なことです。
先ほどの桁の重みの説明では抜けている箇所がありました。
追記したものを下記に示します。
2^6=64(10)
↓ 2^4=16(10)
↓ ↓ 2^2=4(10)
↓ ↓ ↓ 2^0=1(10)
↓ ↓ ↓ ↓
1 1 0 0 1 0 0(2)
↑ ↑ ↑
↑ ↑ 2^1=2(10)
↑ 2^3=8(10)
2^5=32(10)
64(10)×1 + 32(10)×1 + 4(10)×1 = 100(10)
つまり、桁の重みを10進数で表しているので、
10進数の桁の重みをかければ10進数へ基数変換ができるのです。
同じことを8進数と16進数でも基数変換でもやってみます。
2進数→8進数の基数変換
2^6=100(8)
↓ 2^4=20(8)
↓ ↓ 2^2=4(8)
↓ ↓ ↓ 2^0=1(8)
↓ ↓ ↓ ↓
1 1 0 0 1 0 0(2)
↑ ↑ ↑
↑ ↑ 2^1=2(8)
↑ 2^3=10(8)
2^5=40(8)
100(8)×1 + 40(8)×1 + 4(8)×1 = 144(8)
2進数→16進数の基数変換
2^6=40(16)
↓ 2^4=10(16)
↓ ↓ 2^2=4(16)
↓ ↓ ↓ 2^0=1(16)
↓ ↓ ↓ ↓
1 1 0 0 1 0 0(2)
↑ ↑ ↑
↑ ↑ 2^1=2(16)
↑ 2^3=8(16)
2^5=20(16)
40(16)×1 + 20(16)×1 + 4(16)×1 = 64(16)
8進数→16進数の基数変換
8^2=40(16)
↓ 8^0=1(16)
↓ ↓
1 4 4(8)
↑
8^1=8(16)
40(16)×1 + 8(16)×4 + 1(16)×4 = 64(16)
8進数→10進数の基数変換
8^2=64(10)
↓ 8^0=1(10)
↓ ↓
1 4 4(8)
↑
8^1=8(10)
64(10)×1 + 8(10)×4 + 1(10)×4 = 100(10)
16進数→10進数の基数変換
16^1=16(10)
↓
6 4(16)
↑
16^0=1(10)
16(10)×6 + 1(10)×4 = 100(10)
回答
桁の重みを変換後の基数で算出すれば、任意の基数への基数変換が可能です。
しかし、10進数以外のn進数の掛け算や足し算を計算することは難しいです。
(少なくとも基数変換を学び始める人が、すらすら出来ることはないでしょう。)
なので、通常、基数変換の説明では10進数への変換でしかこの方法はとられません。
結果、桁の重みが10進数となっていることは説明されないのです。