Help us understand the problem. What is going on with this article?

2進数・8進数・10進数・16進数の相互変換についてまとめてみた

More than 3 years have passed since last update.

2進数や8進数などから10進数に変換する


■ 2進数の「1101」を10進数に変換する

1\times(2^3) + 1\times(2^2) + 0\times(2^1) + 1\times(2^0) = 13

Pythonで実行する場合は

>>> int('1101', 2)
13

■ 8進数の「700」を10進数に変換する

7\times(8^2) + 0\times(8^1) + 0\times(8^0) = 448

Pythonで実行する場合は

>>> int('700', 8)
448

■ 16進数の「FE」を10進数に変換する

15\times(16^1) + 14\times(16^0) = 254

Pythonで実行する場合は

>>> int('FE', 16)
254

2進数や8進数などから10進数に変換する(小数の場合)


※Pythonで実行する場合は自前で実装する必要がある(参考記事を参照)

■ 2進数の「0.011」を10進数に変換する

0\times(2^{-1}) + 1\times(2^{-2}) + 1\times(2^{-3}) = 0.375

■ 8進数の「0.603」を10進数に変換する

6\times(8^{-1}) + 0\times(8^{-2}) + 3\times(8^{-3}) = 0.755859375

■ 16進数の「0.A01」を10進数に変換する

10\times(16^{-1}) + 0\times(16^{-2}) + 1\times(16^{-3}) = 0.62524414062

10進数を2進数や8進数に変換する


■ 10進数の「23」を2進数に変換する

2で割ると右にシフトすることを利用する。

23\div2 = 11 \quad余り\quad1\\
11\div2 = 5 \quad余り\quad1\\
5\div2 = 2 \quad余り\quad1\\
2\div2 = 1 \quad余り\quad0\\
1\div2 = 0 \quad余り\quad1\\
余りを下から順につなげて10111

Pythonで実行する場合は

>>> bin(23)
'0b10111'

■ 10進数の「23」を8進数に変換する

8で割ると右にシフトすることを利用する。

23\div8 = 2 \quad余り\quad7\\
2\div8 = 0 \quad余り\quad2\\
余りを下から順につなげて27

Pythonで実行する場合は

>>> oct(23)
'0o27'

■ 10進数の「23」を16進数に変換する

16で割ると右にシフトすることを利用する。

23\div16 = 1 \quad余り\quad7\\
1\div16 = 0 \quad余り\quad1\\
余りを下から順につなげて17

Pythonで実行する場合は

>>> hex(23)
'0x17'

10進数を2進数や8進数に変換する(小数の場合)


※Pythonで実行する場合は自前で実装する必要がある

■ 10進数の「0.125」を2進数に変換する

2倍すると左にシフトすることを利用する。

0.125\times2 = 0.25 \quad1桁目\quad0\\
0.25\times2 = 0.5 \quad1桁目\quad0\\
0.5\times2 = 1.0 \quad1桁目\quad1\\
1桁目を上から順につなげて0.001

■ 10進数の「0.125」を8進数に変換する

8倍すると左にシフトすることを利用する。

0.125\times8 = 1.0 \quad1桁目\quad1\\
1桁目を上から順につなげて0.1

■ 10進数の「0.125」を16進数に変換する

16倍すると左にシフトすることを利用する。

0.125\times16 = 2.0 \quad1桁目\quad2\\
1桁目を上から順につなげて0.2

2進数を8進数や16進数に変換する


■ 2進数の「1101101」を8進数に変換する。

3桁ごと(足りない場合はゼロで桁合わせ)に分けて10進数変換し、連結する

001\quad101\quad101\\
0\times(2^2) + 0\times(2^1) + 1\times(2^0) = 1\\
1\times(2^2) + 0\times(2^1) + 1\times(2^0) = 5\\
1\times(2^2) + 0\times(2^1) + 1\times(2^0) = 5\\
連結すると155

Pythonで実行する場合は

>>> format(int('1101101', 2),'o')
'155'

■ 2進数の「1101101」を16進数に変換する。

4桁ごと(足りない場合はゼロで桁合わせ)に分けて10進数変換し、連結する

0110\quad1101\\
0\times(2^3) + 1\times(2^2) + 1\times(2^1) + 0\times(2^0) = 6\\
1\times(2^3) + 1\times(2^2) + 0\times(2^1) + 1\times(2^0) = 13\\
連結すると6D

Pythonで実行する場合は

>>> format(int('1101101', 2),'x')
'6d'

2進数を8進数や16進数に変換する(小数の場合)


※Pythonで実行する場合は自前で実装する必要がある

■ 2進数の「0.0110111」を8進数に変換する

3桁ごと(足りない場合はゼロで桁合わせ)に分けて10進数変換し、連結する

011\quad011\quad100\\
0\times(2^{2}) + 1\times(2^{1}) + 1\times(2^{0}) = 3\\
0\times(2^{2}) + 1\times(2^{1}) + 1\times(2^{0}) = 3\\
1\times(2^{2}) + 0\times(2^{1}) + 0\times(2^{0}) = 4\\
連結すると0.334

■ 2進数の「0.0110111」を16進数に変換する

4桁ごと(足りない場合はゼロで桁合わせ)に分けて10進数変換し、連結する

0110\quad1110
0\times(2^{3}) + 1\times(2^{2}) + 1\times(2^{1}) + 0\times(2^{0}) = 6\\
1\times(2^{3}) + 1\times(2^{2}) + 1\times(2^{1}) + 0\times(2^{0}) = E\\
連結すると0.6E

8進数や16進数を2進数にする


■ 8進数の「664」を2進数に変換する

それぞれの桁を2進数に変換して連結する

6\div2 = 3 \quad余り\quad0\\
3\div2 = 1 \quad余り\quad1\\
1\div2 = 0 \quad余り\quad1\\
余りを下から順につなげて110\\
6\div2 = 3 \quad余り\quad0\\
3\div2 = 1 \quad余り\quad1\\
1\div2 = 0 \quad余り\quad1\\
余りを下から順につなげて110\\
4\div2 = 2 \quad余り\quad0\\
2\div2 = 1 \quad余り\quad0\\
1\div2 = 0 \quad余り\quad1\\
余りを下から順につなげて100\\
連結すると110110100

■ 8進数の「664」を16進数に変換する

2進数に変換してから16進数に変換する

0001\quad1011\quad0100\\
0\times(2^{3}) + 0\times(2^{2}) + 0\times(2^{1}) + 1\times(2^{0}) = 1\\
1\times(2^{3}) + 0\times(2^{2}) + 1\times(2^{1}) + 1\times(2^{0}) = B\\
0\times(2^{3}) + 1\times(2^{2}) + 0\times(2^{1}) + 0\times(2^{0}) = 4\\
連結すると1B4

8進数や16進数を2進数にする(小数の場合)


※Pythonで実行する場合は自前で実装する必要がある

■ 8進数の「0.664」を2進数に変換する

小数以下のそれぞれの桁を2進数に変換して連結する

6\div2 = 3 \quad余り\quad0\\
3\div2 = 1 \quad余り\quad1\\
1\div2 = 0 \quad余り\quad1\\
余りを下から順につなげて110\\
6\div2 = 3 \quad余り\quad0\\
3\div2 = 1 \quad余り\quad1\\
1\div2 = 0 \quad余り\quad1\\
余りを下から順につなげて110\\
4\div2 = 2 \quad余り\quad0\\
2\div2 = 1 \quad余り\quad0\\
1\div2 = 0 \quad余り\quad1\\
余りを下から順につなげて100\\
連結すると0.1101101

■ 8進数の「0.664」を16進数に変換する

2進数に変換してから16進数に変換する
math
1101\quad1010\\
1\times(2^{3}) + 1\times(2^{2}) + 0\times(2^{1}) + 1\times(2^{0}) = D\\
1\times(2^{3}) + 0\times(2^{2}) + 1\times(2^{1}) + 0\times(2^{0}) = A\\
連結すると0.DA

負の10進数を符号付き2進数や符号付き16進数にする


■ 10進数の「-23」を符号付き8bit2進数に変換する

23を2進数に変換した後に、2の補数を求める

23\div2 = 11 \quad余り\quad1\\
11\div2 = 5 \quad余り\quad1\\
5\div2 = 2 \quad余り\quad1\\
2\div2 = 1 \quad余り\quad0\\
1\div2 = 0 \quad余り\quad1\\
余りを下から順につなげて00010111\\
00010111の2の補数は\\
11101000 + 1 = 11101001

Pythonで実行する場合は

>>> '{:08b}'.format(-23 & 0xff)
'11101001'

■ 10進数の「-23」を符号付き8bit16進数に変換する

-23を2進数の2の補数に変換した後に、16進数に変換する。

1110\quad1001
1\times(2^{3}) + 1\times(2^{2}) + 1\times(2^{1}) + 0\times(2^{0}) = E\\
1\times(2^{3}) + 0\times(2^{2}) + 0\times(2^{1}) + 1\times(2^{0}) = 9\\
連結するとE9

Pythonで実行する場合は

>>> '{:02x}'.format(-23 & 0xff)
'e9'

符号付き2進数や符号付き16進数を10進数にする


■ 符号付き2進数の「11101001」を10進数に変換する

先頭が1であるため2進数の2の補数を求め、10進数に変換後、マイナスを付ける

11101001の2の補数は\\
00010111\\
1\times(2^{4}) + 0\times(2^{3}) + 1\times(2^{2}) + 1\times(2^{1}) + 1\times(2^{0}) = 23\\
マイナスを付けて-23

参考になった記事


Python で小数点対応の N 進数から 10 進数に変換するプログラムを書いた
2進数・16進数・論理演算第3日目:シフトと乗算・除算
10 進数から 2 進数への変換
n 進数の世界 (符号つき数)
Python | 2の補数のビットパターンを文字列で得る方法

manabu013
研究開発、営業支援 python/java/machine learning/solr
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away