ブログの説明

学校に通わないで学んだことを記しています。間違っているところが何かありましたらご指摘下さると幸いです。コメントに対する返信が遅れる可能性があります。その場合は申し訳ありません。

このブログではサイドバーに広告を表示しています。このブログ内の投稿記事を検索するには右上の拡大鏡のアイコンを、アーカイブやラベル付けから投稿記事を閲覧するには左上の三重線のアイコンをクリックして下さい。

数式の表示にはMathJaxを利用させていただいています。数式の表示のためにJavaScriptが有効である必要があります。そうでない場合、訳の分からないLatexのコードが表示されます。幾何学図形やチャートの表示にはHTML5 CanvasやGoogle Chartを使用しています。その表示のためにもJavaScriptが有効である必要があります。

r進数から10進数への変換

r進数のrはradixの頭文字。radixは位取り記数法の基数を意味している。底(base)とも呼ぶ。10進法は0から9までの10個の数を用いるので基数は10となる。2進法では0と1の2つだけの数を用いるので基数は2となる。16進数では0から9までとA, B, C, D, E, Fの計16個の数が用いられるので基数は16となる。

2進数から10進数への変換

例えば1101という2進数を10進数へと変換するには次のように計算する。丸括弧は見やすいように付けた。角各個の添字が基数。各位の値に各位の重み\( 2^3, 2^2, 2^1, 2^0 \)をそれぞれ掛けて最後に足し合わせている。

\[ \begin{align*} [1101]_2 &\Rightarrow [(1 \times 2^3) + (1 \times 2^2) + (0 \times 2^1) + (1 \times 2^0)]_{10} \\ &\Rightarrow [(1 \times 8) + (1 \times 4) + (0 \times 2) + (1 \times 1)]_{10} \\ &\Rightarrow [8 + 4 + 0 + 1]_{10} \\ &\Rightarrow [13]_{10} \end{align*}\]

2進数である1101を10進数へ変換すると13になった。2進数はその各位の数を\( 2^n \)倍した数と等しい。指数が0から始まり、0乗が常に1になることに要注意。

じゃあ、小数点がある場合はどう計算するのか。例えば1.011という2進数を10進数へと変換するには次のように計算する。各位の値を各位の重み\( 2^1, 2^2, 2^3 \)でそれぞれ割って最後に足し合わせている。

\[ \begin{align*} [1.011]_2 &\Rightarrow \left[(1 \times 2^0) + \left(0 \times \dfrac{1}{2^1}\right) + \left(1 \times \dfrac{1}{2^2}\right) + \left(1 \times \dfrac{1}{2^3}\right)\right]_{10} \\ &\Rightarrow [(1 \times 2^0) + (0 \div 2^1) + (1 \div 2^2) + (1 \div 2^3)]_{10} \\ &\Rightarrow [(1 \times 1) + (0 \div 2) + (1 \div 4) + (1 \div 8)]_{10} \\ &\Rightarrow [1 + 0 + 0.25 + 0.125]_{10} \\ &\Rightarrow [1.375]_{10} \end{align*} \]

2進数である1.011を10進数へ変換すると1.375になった。小数点以下は分数の掛け算になる。ただし、分数を掛けることはその分数の分母と分子を入れ替えた逆数で割ることと同じ、つまり\( a \times \dfrac{1}{b} = a \div \dfrac{b}{1} = a \div b \)であるので、割り算として計算することになる。

3進数から10進数への変換

例えば2120という3進数を10進数へと変換するには次のように計算する。2進数では2だった部分が3進数では3になっていることを確認されたし。

\[ \begin{align*} [2120]_3 &\Rightarrow [(2 \times 3^3) + (1 \times 3^2) + (2 \times 3^1) + (0 \times 3^0)]_{10} \\ &\Rightarrow [(2 \times 27) + (1 \times 9) + (2 \times 3) + (0 \times 1)]_{10} \\ &\Rightarrow [54 + 9 + 6 + 0]_{10} \\ &\Rightarrow [69]_{10} \end{align*} \]

3進数である2120を10進数へ変換すると69になった。2進数から10進数への変換のための計算式と3進数から10進数への変換のための計算式との違いに注目。\( 2^n \)倍が\( 3^n \)倍になっていることが分かる。

例えば2.102という3進数を10進数へと変換するには次のように計算する。

\[ \begin{align*} [2.102]_3 &\Rightarrow \left[(2 \times 3^0) + \left(1 \times \dfrac{1}{3^1}\right) + \left(0 \times \dfrac{1}{3^2}\right) + \left(2 \times \dfrac{1}{3^3}\right)\right]_{10} \\ &\Rightarrow [(2 \times 3^0) + (1 \div 3^1) + (0 \div 3^2) + (2 \div 3^3)]_{10} \\ &\Rightarrow [(2 \times 1) + (1 \div 3) + (0 \div 9) + (1 \div 27)]_{10} \\ &\Rightarrow [2 + 0.3333... + 0 + 0.037037...]_{10} \\ &\Rightarrow [2.370370370...]_{10} \end{align*} \]

3進数である2.102を10進数へ変換すると2.370370370...になった。

4進数から10進数への変換

例えば1032という4進数を10進数へと変換するには次のように計算する。

\[ \begin{align*} [1032]_4 &\Rightarrow [(1 \times 4^3) + (0 \times 4^2) + (3 \times 4^1) + (2 \times 4^0)]_{10} \\ &\Rightarrow [(1 \times 64) + (0 \times 16) + (3 \times 4) + (2 \times 1)]_{10} \\ &\Rightarrow [64 + 0 + 12 + 2]_{10} \\ &\Rightarrow [78]_{10} \end{align*} \]

4進数である1032を10進数へ変換すると78になった。

例えば1.032という4進数を10進数へと変換するには次のように計算する。

\[ \begin{align*} [1.032]_4 &\Rightarrow \left[(1 \times 4^0) + \left(0 \times \dfrac{1}{4^1}\right) + \left(3 \times \dfrac{1}{4^2}\right) + \left(2 \times \dfrac{1}{4^3}\right)\right]_{10} \\ &\Rightarrow [(1 \times 4^0) + (0 \div 4^1) + (3 \div 4^2) + (2 \div 4^3)]_{10} \\ &\Rightarrow [(1 \times 1) + (0 \div 4) + (3 \div 16) + (2 \div 64)]_{10} \\ &\Rightarrow [1 + 0 + 0.1875 + 0.03125]_{10} \\ &\Rightarrow [1.21875]_{10} \end{align*} \]

4進数である1.032を10進数へ変換すると1.21875になった。

8進数から10進数への変換

例えば2475という8進数を10進数へと変換するには次のように計算する。

\[ \begin{align*} [2475]_8 &\Rightarrow [(2 \times 8^3) + (4 \times 8^2) + (7 \times 8^1) + (5 \times 8^0)]_{10} \\ &\Rightarrow [(2 \times 512) + (4 \times 64) + (7 \times 8) + (5 \times 1)]_{10} \\ &\Rightarrow [1024 + 256 + 56 + 5]_{10} \\ &\Rightarrow [1341]_{10} \end{align*} \]

8進数である2475を10進数へ変換すると1341になった。

例えば2.475という8進数を10進数へと変換するには次のように計算する。

\[ \begin{align*} [2.475]_8 &\Rightarrow \left[(2 \times 8^0) + \left(4 \times \dfrac{1}{8^1}\right) + \left(7 \times \dfrac{1}{8^2}\right) + \left(5 \times \dfrac{1}{8^3}\right)\right]_{10} \\ &\Rightarrow [(2 \times 8^0) + (4 \div 8^1) + (7 \div 8^2) + (5 \div 8^3)]_{10} \\ &\Rightarrow [(2 \times 1) + (4 \div 8) + (7 \div 64) + (5 \div 512)]_{10} \\ &\Rightarrow [2 + 0.5 + 0.109375 + 0.009765625]_{10} \\ &\Rightarrow [2.619140625]_{10} \end{align*} \]

8進数である2.475を10進数へ変換すると2.619140625になった。

16進数から10進数への変換

例えば5CF2という16進数を10進数へと変換するには次のように計算する。

\[ \begin{align*} [1032]_{16} &\Rightarrow [(5 \times 16^3) + (12 \times 16^2) + (15 \times 16^1) + (2 \times 16^0)]_{10} \\ &\Rightarrow [(5 \times 4096) + (12 \times 256) + (15 \times 16) + (2 \times 1)]_{10} \\ &\Rightarrow [20480 + 3072 + 240 + 2]_{10} \\ &\Rightarrow [23794]_{10} \end{align*} \]

16進数である5CF2を10進数へ変換すると23794になった。

例えば5.CF2という16進数を10進数へと変換するには次のように計算する。

\[ \begin{align*} [5.CF2]_{16} &\Rightarrow \left[(5 \times 16^0) + \left(12 \times \dfrac{1}{16^1}\right) + \left(15 \times \dfrac{1}{16^2}\right) + \left(2 \times \dfrac{1}{16^3}\right)\right]_{10} \\ &\Rightarrow [(5 \times 16^0) + (12 \div 16^1) + (15 \div 16^2) + (2 \div 16^3)]_{10} \\ &\Rightarrow [(5 \times 1) + (12 \div 16) + (15 \div 256) + (2 \div 4096)]_{10} \\ &\Rightarrow [5 + 0.75 + 0.05859375 + 0.00048828125]_{10} \\ &\Rightarrow [5.80908203125]_{10} \end{align*} \]

16進数である5.CF2を10進数へ変換すると5.80908203125になった。

r進数から10進数への変換

これらの実例からして、r進数から10進数への変換は一般に次のように計算することができそう。aは各位の数を表す変数、iは各位の大小関係を表す番号、rはr進数のrを表す基数、 Σ シグマ はギリシア文字の一つだが、数学ではその右の変数または変数の項(変数の掛け算や割り算)の集合を全部足し合わせることを意味している。掛け算を表すバッテン記号は数学の慣例に倣って省略してある。

小数点以上の位(整数部)の場合:

\[ \begin{align*} [a_n \cdots a_2 a_1 a_0 ]_r &\Rightarrow \left[\sum_{i=0}^n (a_i r^i)\right]_{10} \\ &\Rightarrow [a_n r^n + \cdots + a_2 r^2 + a_1 r^1 + a_0 r^0]_{10} \end{align*} \]

小数点以下の位(小数部)の場合:

\[ \begin{align*} [0 . a_1 a_2 a_3 \cdots a_n ]_r &\Rightarrow \left[\sum_{i=1}^n (a_i \dfrac{1}{r^i})\right]_{10} \\ &\Rightarrow \left[a_1 \dfrac{1}{r^1} + a_2 \dfrac{1}{r^2} + a_3 \dfrac{1}{r^3} + \cdots a_n \dfrac{1}{r^n}\right]_{10} \\ &\Rightarrow \left[\dfrac{a_1}{r^1} + \dfrac{a_2}{r^2} + \dfrac{a_3}{r^3} + \cdots + \dfrac{a_n}{r^n}\right]_{10} \end{align*} \]

r進数の位と10進数の位の対応表

10進数以外のr進数において各位のことを、1の位、10の位、100の位などとは普通は言わないかもしれないけれども、ここでは便宜的にそのように呼ぶことにする。ただし、10はジューとは読まずイチゼロ、100はヒャクとは読ますイチゼロゼロと読むことにする。ここでいう「重み」とは各位の数に掛ける数のことを指している。位取り記数法では各位の数は、その数掛ける各位の重みを意味する。

r進数の位(重み) 10進数での重み
100000 = \( 10^5 \)の位 \( r^5 \)
10000 = \( 10^4 \)の位 \( r^4 \)
1000 = \( 10^3 \)の位 \( r^3 \)
100 = \( 10^2 \)の位 \( r^2 \)
10 = \( 10^1 \)の位 \( r^1 \)
1 = \( 10^0 \)の位 \( r^0 \)
ここから上が小数点以上 ここから下が小数点以下
0.1 = \( \dfrac{1}{10^1}の位 \) \( \dfrac{1}{r^1} \)
0.01 = \( \dfrac{1}{10^2}の位 \) \( \dfrac{1}{r^2} \)
0.001 = \( \dfrac{1}{10^3}の位 \) \( \dfrac{1}{r^3} \)
0.0001 = \( \dfrac{1}{10^4}の位 \) \( \dfrac{1}{r^4} \)
0.00001 = \( \dfrac{1}{10^5}の位 \) \( \dfrac{1}{r^5} \)

例えば10.11がr進数だとして、この数の一番右端の0.01を10進数に変換したいとき、この表によれば、基数rの2乗分の1を掛ければよいことが分かる。分数を掛けるということはその分数の分母と分子を入れ替えた逆数で割ることと同じなので、その位の数である1を基数rの2乗で割ると10進数に変換される。

以上。10進数からr進数への変換、さらに2進数、4進数、8進数、16進数の間での相互変換についてはまたの機会に。

まとめ

r進数から10進数への変換は次のようなアルゴリズムを用いて行うことができる。

  1. r進数のrを求める。このrは自然数。この自然数がその数の基数となる。2進数ならば2のこと。
  2. r進数の各位(各桁)が整数の場合、その各位の値にその基数(r進数のr)のi乗を掛ける。
    \[ 整数部の各位の値 \times r^i \ (i = \{0, 1, 2, 3, \cdots, n \}) \]

    iは0から始まる各位の順番。nはその位が何番目(何桁)まであるかを示している。

  3. r進数の各位(各桁)が小数の場合、その各位の値をその基数(r進数のr)のi乗で割る。あるいは、その各位の値にその基数(r進数のr)のi乗分の1を掛ける。
    \[ \begin{align*} Int := 整数部での各位の値 \\ Dec := 小数部での各位の値 \\ Int \div r^i (i = \{1, 2, 3, 4, \cdots, n \}) \\ Dec \times \dfrac{1}{r^i} (i = \{1, 2, 3, 4, \cdots, n \}) \end{align*} \]

    \( r^n \)はその位(桁)の重みと呼ばれている。

  4. 各位(各桁)に重みを掛けて得られた数(整数部と小数部)を総て足し合わせる。
    \[ \begin{align*} Int := 整数部での各位の値 \\ Dec := 小数部での各位の値 \\ \left( \sum_{i=0}^n Int_i \times r^i \right) + \left( \sum_{i=1}^n Dec_i \times \dfrac{1}{r^i} \right) \end{align*} \]

    左が整数部の総和で右が小数部の総和。IntとDecはr進法での各位の値。iは小数点に近いほうから数えた各位(各桁)の順番。ただし、整数部ではiが0から始まり、小数部ではiが1から始まることに要注意。

  5. その結果導かれた数が、とあるr進法の数を変換して得られた10進法の数であることを意味している。

コメント

このブログの人気の投稿

Visual Studio 2019にはC++のためのフォームデザイナーがない件

10の補数と9の補数と2の補数と1の補数

LATEXで数式:指数と順列などで使う添数・添字