3 基数の変換

3.1 2進数と10進数の変換

3.1.1 2進数 $ \rightarrow $ 10進数

2進数から10進数への変換は簡単である。式(1)を理解して いれば、分かる。2進数であろうが10進数であろうが、表記法は同じで、約束に従って変 形すれば良い。次のようにする。

$\displaystyle (10011)_2$ $\displaystyle =(1\times 10^{100}+0\times 10^{11}+0\times 10^{10}+1\times 10^1 +1\times 10^0)_2$    
  $\displaystyle =(1\times 2^4+0\times 2^3+0\times 2^2+1\times 2^1+1\times 2^0)_{10}$    
  $\displaystyle =(16+0+0+2+1)_{10}$    
  $\displaystyle =(19)_{10}$ (2)

この手中を順を追って説明すると、以下のようになる。
  1. まずは、1行目右辺のように位取り記数法で表現する。
  2. そうして、表1に従い、式を変換したい基数に直す。
  3. 後は地道に計算するだけ。
通常は、1行目の右辺は省き、2行目から計算する。

3.1.2 10進数 $ \rightarrow $ 2進数

今度は逆で10進数から2進数への変換である。原理的に、先ほどと同じように変換ができ るが、計算してみるとそれは難しい2。これ は、我々は10進数の演算になれていることが原因となっている。自然には、10進数であろ うと2進数であろうと優位性は無いからである。

10進数から2進数への計算手法は簡単であるが、その内容を理解することが大事である。 計算手法を忘れても、内容が理解できていれば、その方法はいつでも自分で作ることがで きる。また、応用範囲も広がる。では、簡単な例で説明する。10進数の$ (19)_{10}$を2進 数に変換する方法を示す。具体的には、19を

$\displaystyle (19)_{10}=(\cdots+a_4\times 2^4+a_3\times 2^3+a_2\times 2^2+a_1\times 2^1+ a_0\times 2^0)_{10}$ (3)

と表現したい。これは式(2)の2行目の式で、ここで求められ た係数を $ (\cdots a_4 a_3 a_2 a_1 a_0)_2$と並べれば位取り記数法になる。それぞれ、 $ a_n$を求めなくてはならない。そこで、次のように19を2で割った商と余りを考える。これは、

$\displaystyle (9\times2+1)_{10} =(\cdots+a_4\times 2^3+a_3\times 2^2+a_2\times 2^1+a_1\times 2^0)_{10} \times 2+a_0$ (4)

と書ける。これをよくにらむと、$ a_0=1$ということが分かる。すなわち、$ a_0$は19を2で 割ったあまりである。残りの部分は、

$\displaystyle (9)_{10} =(\cdots+a_4\times 2^3+a_3\times 2^2+a_2\times 2^1+a_1\times 2^0)_{10}$ (5)

となることも分かるでろう。商について同じことをすると、

$\displaystyle (4\times 2+1)_{10} =(\cdots+a_5\times 2^3+a_4\times 2^2+a_3\times 2^1+a_2\times 2^0)_{10} \times 2+a_1$ (6)

となる。したがって、$ a_1=1$である。しつこいが、さらに商について同様に進めると、

$\displaystyle (2\times 2+0)_{10}$ $\displaystyle =(\cdots+a_6\times 2^3+a_5\times 2^2+a_4\times 2^1+a_3\times 2^0)_{10} \times 2+a_2$   $\displaystyle \Rightarrow$   $\displaystyle a_2=0$   (7)
$\displaystyle (1\times 2+0)_{10}$ $\displaystyle =(\cdots+a_7\times 2^3+a_6\times 2^2+a_5\times 2^1+a_4\times 2^0)_{10} \times 2+a_3$   $\displaystyle \Rightarrow$   $\displaystyle a_3=0$   (8)
$\displaystyle (0\times 2+1)_{10}$ $\displaystyle =(\cdots+a_8\times 2^3+a_7\times 2^2+a_6\times 2^1+a_5\times 2^0)_{10} \times 2+a_4$   $\displaystyle \Rightarrow$   $\displaystyle a_4=1$   (9)

となる。最後の式から、 $ a_n=0\quad(5\leq n)$ が分かる。以上をまとめると

$\displaystyle (19)_{10}$ $\displaystyle =(a_4\times 2^4+a_3\times 2^3+a_2\times 2^2+a_1\times 2^1+ a_0\times 2^0)_{10}$    
  $\displaystyle =(1\times 2^4+0\times 2^3+0\times 2^2+1\times 2^1+1\times 2^0)_{10}$ (10)
  $\displaystyle =(10011)_2$    

となる。要するに、2で割ったあまりを書いていけば良いのである。計算方法は分かった。 だがこの方法は実際的ではない。よく使われるのは、図2の ように2で割った余りを並べる。これは、 $ (19)_{10}=(10011)_2,\quad(2003)_{10}=(11111010011)_2$ を示している。
図 2: 10進数から2進数への変換方法。
\includegraphics[keepaspectratio, scale=0.7]{figure/decimal_to_binary.eps}
内容を十分理解し、変換の練習をしなくてはならない。

3.2 16進数

2進数の変換が理解できたら、16進数の変換はまったくもって簡単である。

3.2.1 16進数 $ \rightarrow $ 10進数

2進数と同じで次のようにする。

$\displaystyle (376)_{16}$ $\displaystyle =(3\times 10^2+7\times 10^1+6\times 10^0)_{16}$    
  $\displaystyle =(3\times 16^2+7\times 16^1+6\times 16^0)_{10}$    
  $\displaystyle =(3\times 256+7\times 16+6\times 1)_{10}$    
  $\displaystyle =(886)_{10}$ (11)

3.2.2 10進数 $ \rightarrow $ 16進数

これも2進数と同様に考える。16で割ったあまりを並べれば良い。図 3のようにして、 $ (25391)_{10}=(632F)_{16}$ を計算する。
図 3: 10進数から16進数への変換方法
\includegraphics[keepaspectratio, scale=0.7]{figure/decimal_to_hex.eps}
手計算ではこの方法を用いるが、実際のエンジニアーは電卓の変換機能を使う。

コーヒーブレイク
昔から言われるジョークをひとつ。プログラマーは、クリスマス(12月25日)と ハロウィーン(10月31日)が区別できない。なぜか?。ヒント
  • 10進数(decimal number)のことをDECと書く。DEC 23 と書けば、10進数 の23をあらわしている。
  • 8進数(octal number)はのことをOCTとかく。OCT 23 と書けば、8進数 の23を表している。

3.3 2進数と16進数の変換

2進数と16進数の相互の変換は簡単である。$ 2^4=16$なので、2進数の4桁は16進数の一桁 に対応している。図4のように、1桁の16進数を4桁の2進数に変換す れば良い。反対に4桁の2進数は、1桁の16進数に変換できる。
図 4: 2進数と16進数の相互変換方法
\includegraphics[keepaspectratio, scale=0.8]{figure/binary_hex.eps}

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成17年6月6日


no counter