3 基数の変換

3.1 2進数と10進数の変換

3.1.1 2進数 $ \rightarrow$ 10進数

2進数から10進数への変換は簡単である.式(16)を理解して いれば,分かる.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進数への変換である.原理的に,先ほどと同じように変換ができ るが,計算してみるとそれは難しい3.これ は,我々は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
平成19年6月24日


no counter