3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【基本情報とかで出るやつ】10進数から2進数への変換をちょっと丁寧に

Last updated at Posted at 2019-01-11

はじめに

後回しにしていたけどそろそろ応用情報を取っとこうと思う。
毎回、10進数を2進数に変換するやり方を忘れるのでちょっと深掘りして少しまとめておく。
いま29.3歳くらいなのでこれを2進数にしてみよう。11101.001011... になる。

機械的な計算方法

  • 整数部分(29)と小数部分(0.3)は別にして扱う。
    • 整数部分は、2で割って、商と余りを求める。商をさらに2で割って、商と余りを求める。これを商が0になるまで繰り返す。余りを下から順に左から右に並べると2進数での表示になる(図1)。
    • 小数部分は、2を掛けて、積を求める。積の小数部分だけ取り出して、さらに2を掛けて積を求める。これを積が0になるまで繰り返す(0にならずに循環する場合は適当に打ち切る)。積の整数部分を上から順に左から右に並べると2進数での表示になる(図2)。
    • 上からとか下からとかをよく忘れる。

base_conversion01.png
... 図1: 整数部分の計算方法

base_conversion02.png
... 図2: 小数部分の計算方法

こうやっていい根拠

整数部分

$a_{i}$は0か1であるとする(というかなる)。
29を2進数で表したいというのは、以下を満たす$a_{i}$を決めたいということだ:

29 \, =  \,\cdots\, + a_{4}2^{4} + a_{3}2^{3} + a_{2}2^{2} + a_{1}2^{1} + a_{0}2^{0}

右辺が何項あるのかは現時点では不明である。
ここで、右辺の$a_{0}2^{0}$以外の項をかっこでくくる。あと、$a_{0}2^{0}$ は $a_{0}$ と書くことにする。

29 \, =  \, (\,\cdots\, + a_{4}2^{4} + a_{3}2^{3} + a_{2}2^{2} + a_{1}2^{1}) + a_{0}

右辺のかっこから2をくくりだす。それぞれの項の2の指数が1ずつ減る。

29 = (\cdots + a_{4}2^{3} + a_{3}2^{2} + a_{2}2^{1} + a_{1}2^{0}) \times 2 + a_{0}

左辺の29という数は、$14 \times 2 + 1$とも書ける。というわけで、

14 \times 2 + 1 = (\cdots + a_{4}2^{3} + a_{3}2^{2} + a_{2}2^{1} + a_{1}2^{0}) \times 2 + a_{0} \tag{1}

つまり、$(\cdots + a_{4}2^{3} + a_{3}2^{2} + a_{2}2^{1} + a_{1}2^{0}) = 14$で、また、$a_{0} = 1$ であることがわかる。

同様の計算を繰り返していく:

\begin{align}
14 \,&= \,\,\, \cdots + a_{4}2^{3} + a_{3}2^{2} + a_{2}2^{1} + a_{1}2^{0} \\
14 \,&= \,(\cdots + a_{4}2^{3} + a_{3}2^{2} + a_{2}2^{1}) + a_{1} \\
7 \times 2 + 0 \, &= \,(\cdots + a_{4}2^{2} + a_{3}2^{1} + a_{2}2^{0}) \times 2 + a_{1}
\end{align}

つまり、$(\cdots + a_{4}2^{2} + a_{3}2^{1} + a_{2}2^{0}) = 7$で、また、$a_{1} = 0$ であることがわかる。

以下、左辺が0になるまで続ける。

式(1)でやっているのは、上で見た「機械的な計算方法」(図1)の1回目の2割りと同じ。
それで、式(1)の結果として $a_{0} = 1$ になることが分かった。
2進数で表示するときは$a_{0}$が一番右に来るわけなので、
「下の余りから順に左から右に並べる」ということになる。

小数部分

$b_{i}$は0か1であるとする。
0.3を2進数で表したいというのは、以下を満たす$b_{i}$を決めたいということだ:

0.3 \,=\, b_{1}2^{-1} + b_{2}2^{-2} + b_{3}2^{-3} + b_{4}2^{-4} + \cdots

右辺が何項あるのかは現時点では不明である。
ここで、両辺を2倍する。右辺のそれぞれの項の2の指数が1ずつ増える:

0.6 \,=\, b_{1}2^{0} + b_{2}2^{-1} + b_{3}2^{-2} + b_{4}2^{-3} + \cdots

ここで、右辺の$b_{1}2^{0}$以外の項をかっこでくくる。あと、$b_{1}2^{0}$は$b_{1}$と書くことにする。

0.6 \,=\, b_{1} + (b_{2}2^{-1} + b_{3}2^{-2} + b_{4}2^{-3} + \cdots) \tag{2}

左辺の整数部分は0である。また、右辺のかっこ内は小数となる。かつ、$b_{i}$は0か1であるという制約から、$b_{1}$は0と決まる。

残った小数について同様の計算を繰り返していく:

\begin{align}
0.6 \,&=\, b_{2}2^{-1} + b_{3}2^{-2} + b_{4}2^{-3} + \cdots \\
1.2 \,&=\, b_{2}2^{0} + b_{3}2^{-1} + b_{4}2^{-2} + \cdots \\
1.2 \,&=\, b_{2} + (b_{3}2^{-1} + b_{4}2^{-2} + \cdots)
\end{align}

左辺の整数部分は1である。また、右辺のかっこ内は小数となる。かつ、$b_{i}$は0か1であるという制約から、$b_{2}$は1と決まる。

以下、左辺が0になるまで続ける(循環し始めたらそこらで止める)。

式(2)でやっている操作は、上で見た「機械的な計算方法」(図2)の1回目の2掛けと同じ。
それで、式(2)の結果として $b_{1} = 0$ になることが分かった。
2進数で表示するときは$b_{1}$が(小数点以下の)一番左に来るわけなので、
「上の整数部分から順に左から右に並べる」ということになる。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?