ブログの説明

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

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

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

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

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*} \]

関連記事

  1. 10進数とその各桁の重み
  2. r進数から10進数への変換

コメント

このブログの人気の投稿

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

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

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