10進数から2進数への変換
例えば35という10進数を2進数へと変換するには、10進数の35を2進数の基数である2で35が0になるまで割りつづけ、その余りを得ることで計算する。
\[ \begin{align*}
35 \div 2 = 17 \cdots 1 \\
17 \div 2 = 8 \cdots 1 \\
8 \div 2 = 4 \cdots 0 \\
4 \div 2 = 2 \cdots 0 \\
2 \div 2 = 1 \cdots 0 \\
1 \div 2 = 0 \cdots 1 \\
\Rightarrow 100011 \end{align*} \]
筆算では次のように書くことができる。
\[ \begin{array}{r}
2 \underline{)35} \cdots 1 \\
2 \underline{)17} \cdots 1 \\
2 \underline{)8} \cdots 0 \\
2 \underline{)4} \cdots 0 \\
2 \underline{)2} \cdots 0 \\
2 \underline{)1} \cdots 1 \\
\Rightarrow 100011 \end{array} \]
10進数の35を2進数に変換すると、その計算結果は100011になった。正しかったかどうかを確かめるために逆変換してみる。
\[ \begin{align*}
100011 &\Rightarrow 1 \times 2^5 + 1 \times 2^1 + 1 \times 2^0 \\
&\Rightarrow 1 \times 32 + 1 \times 2 + 1 \times 1 \\
&\Rightarrow 32 + 2 + 1 \\
&\Rightarrow 35 \end{align*} \]
35という結果が得られたので正しそうだ。
10進数を2進数に変換するPython3プログラム
10進数の正の整数を入力すると、その数値を2進数に変換するためのプログラムをPython3で書いてみた。
# 与えられた正の整数を2進数に変換して標準出力するプログラム
# 実行方法は $ python3 ソースファイル名.py
RADIX = 2
denary = input("%s進数に変換したい正の整数を1以上50桁未満で入力:" % RADIX)
if (str.isdecimal(denary) \
and float(denary) > 0 \
and float(denary) < 1e+50):
num = int(denary)
binary = ""
while True:
remainder = str(num % RADIX)
binary = remainder + binary
num = int(num / RADIX)
print(num,remainder,sep="...")
if (num == 0):
break
print("%sを%s進数に変換すると%sになりました。" % (denary,RADIX,binary))
else:
print("無効な数だったので処理できませんでした。")
このプログラムの実行結果の実例は次のとおり。
$ python3 ソースファイル名.py
2進数に変換したい正の整数を1以上50桁未満で入力:35
17...1
8...1
4...0
2...0
1...0
0...1
35を2進数に変換すると100011になりました。
ただしPython3では、同じ結果を得るためにbin函数やformat函数やstr.formatというメソッドを利用することができる。
$ python3
>>> bin(35)
'0b100011'
>>> bin(35)[2:]
'100011'
>>> format(35,'b')
'100011'
>>> '{0:b}'.format(35)
'100011'
10進数から4進数への変換
例えば310という10進数を4進数に変換するには、4進数の基数である4で310が0になるまで割りつづけ、その余りを得ることで計算する。
\[ \begin{align*}
310 \div 4 = 77 \cdots 2 \\
77 \div 4 = 19 \cdots 1 \\
19 \div 4 = 4 \cdots 3 \\
4 \div 4 = 1 \cdots 0 \\
1 \div 4 = 0 \cdots 1 \\
\Rightarrow 10312 \end{align*} \]
筆算では次のように書くことができる。
\[ \begin{array}{rr}
4 \underline{)310} \cdots 2 \\
4 \underline{)77} \cdots 1 \\
4 \underline{)19} \cdots 3 \\
4 \underline{)4} \cdots 0 \\
4 \underline{)1} \cdots 1 \\
\Rightarrow 10312 \end{array} \]
この計算結果は10312になった。逆変換してみる。
\[ \begin{align*}
10312 &\Rightarrow 1 \times 4^4 + 3 \times 4^2 + 1 \times 4^1 + 2 \times 4^0 \\
&\Rightarrow 1 \times 256 + 3 \times 16 + 1 \times 4 + 2 \times 1 \\
&\Rightarrow 256 + 48 + 4 + 2 \\
&\Rightarrow 310 \end{align*} \]
元の数である310が得られた。
10進数を8進数に変換するときには同じようにして8で割りつづけて余りを求めればよいし、10進数を16進数に変換するときにも同じようにして16で割りつづけて余りを求めればよい。しかし小数ではやり方が少し異なる。
10進数を16進数へと変換する
例えば702という10進数を16進数に変換するには、16進数の基数である16で702が0になるまで割りつづけ、その余りを得ることで計算する。
\[ \begin{align*}
702 \div 16 = 43 \cdots 14 \\
43 \div 16 = 2 \cdots 11 \\
2 \div 16 = 0 \cdots 2 \\
\Rightarrow 2BE \end{align*} \]
筆算では次のように書くことができる。
\[ \begin{array}{rr}
16 \underline{)702} \cdots 14 \\
16 \underline{)43} \cdots 11 \\
16 \underline{)2} \cdots 2 \hspace{0.5em} \\
\Rightarrow 2BE \end{array} \]
10進数である702を16進数へ変換すると、14は16進法ではEになり11は16進法ではBになるので、その計算結果は2BEになった。
逆変換してみる。
\[ \begin{align*}
2BE &\Rightarrow 2 \times 16^2 + 11 \times 16^1 + 14 \times 16^0 \\
&\Rightarrow 2 \times 256 + 11 \times 16 + 14 \times 1 \\
&\Rightarrow 512 + 176 + 14 \\
&\Rightarrow 702 \end{align*} \]
702という元の数が得られた。
10進数を16進数に変換するPython3プログラム
10進数の自然数を16進数に変換するPython3のプログラムを書いてみた。16進法の表記に対応するように上述のプログラムに多少変更を加えたもの。
# 与えられた正の整数を16進数に変換して標準出力するプログラム
# 実行方法は $ python3 ソースファイル名.py
RADIX = 16
denary = input("%s進数に変換したい正の整数を1以上50桁未満で入力:" % RADIX)
if(str.isdecimal(denary) \
and float(denary) > 0 \
and float(denary) < 1e+50):
num = int(denary)
hexadecimal = ""
while True:
remainder = num % RADIX
remainder = '{:X}'.format(remainder)
hexadecimal = str(remainder + hexadecimal)
num = int(num / RADIX)
print(num,remainder,sep="...")
if (num == 0):
break
print("%sを%s進数に変換すると%sになりました。" % (denary,RADIX,hexadecimal))
else:
print("無効な値だったので処理できませんでした。")
実行結果の実例は次のとおり。
$ python3 ソースファイル名.py
16進数に変換したい正の整数を1以上50桁未満で入力:702
43...E
2...B
0...2
702を16進数に変換すると2BEになりました。
ただしPython3では、同じ結果を得るためにhex函数またはformat函数やstr.formatというメソッドを利用することができる。
$ python3
>>> hex(702)
'0x2be'
>>> hex(702)[2:]
'2be'
>>> format(702,'x')
'2be'
>>> format(702,'X')
'2BE'
>>> '{0:x}'.format(702)
'2be'
>>> '{0:X}'.format(702)
'2BE'
10進数の小数を2進数へと変換する
例えば0.375という10進数を2進数へ変換するには、2進数の基数である2を0.375に掛けてその答えの小数部をまた2で掛けることを小数部が0になるまで繰り返す。そうして得られた答えの整数部の部分が変換結果を意味している。変換結果も小数になる。
\[ \begin{align*}
0.375 \times 2 = 0.75 \Rightarrow 0.0 \\
0.75 \times 2 = 1.5 \Rightarrow 0.01 \\
0.5 \times 2 = 1.0 \Rightarrow 0.011 \end{align*} \]
10進数の小数である0.375を2進数へ変換すると0.011になった。逆変換して確かめてみる。
\[ \begin{align*}
0.011 &\Rightarrow 1 \times \dfrac{1}{2^2} + 1 \times \dfrac{1}{2^3} \\
&\Rightarrow 1 \div 2^2 + 1 \div 2^3 \\
&\Rightarrow 1 \div 4 + 1 \div 8 \\
&\Rightarrow 0.25 + 0.125 \\
&\Rightarrow 0.375 \end{align*} \]
元の数が得られた。
しかし、いくら掛けても小数部が0になかなかならない場合がある。例えば0.37という10進数を2進数に変換してみる。
\[ \begin{align*}
0.37 \times 2 = 0.74 \Rightarrow 0.0 \\
0.74 \times 2 = 1.48 \Rightarrow 0.01 \\
0.48 \times 2 = 0.96 \Rightarrow 0.010 \\
0.96 \times 2 = 1.92 \Rightarrow 0.0101 \\
0.92 \times 2 = 1.84 \Rightarrow 0.01011 \\
0.84 \times 2 = 1.68 \Rightarrow 0.010111 \\
0.68 \times 2 = 1.36 \Rightarrow 0.0101111 \\
0.36 \times 2 = 0.72 \Rightarrow 0.01011110 \\
0.72 \times 2 = 1.44 \Rightarrow 0.010111101 \\
\vdots \hspace{25mm} \\
\Rightarrow 0.0101111010111000010 \cdots \end{align*} \]
このような場合には現実問題として途中で打ち切ることになる。このことを丸めると呼ぶことがある。その場合は逆変換しても元の数にならずに誤差が生じる。
整数部と小数部がある場合
例えば35.375の場合は整数部と小数部とをそれぞれの方法で計算してから最後に足し合わせる。
\[ \begin{align*}
35 \div 2 = 17 \cdots 1 \\
17 \div 2 = 8 \cdots 1 \\
8 \div 2 = 4 \cdots 0 \\
4 \div 2 = 2 \cdots 0 \\
2 \div 2 = 1 \cdots 0 \\
1 \div 2 = 0 \cdots 1 \\
\Rightarrow 100011 \\
0.375 \times 2 = 0.75 \Rightarrow 0.0 \\
0.75 \times 2 = 1.5 \Rightarrow 0.01 \\
0.5 \times 2 = 1.0 \Rightarrow 0.011 \\
100011 + 0.011 = 100011.011 \end{align*} \]
関連記事
- 10進数とその各桁の重み
- r進数から10進数への変換
コメント
コメントを投稿