【Python】2進数、8進数、16進数、10進数の変換方法(bin, hex, oct, int)

Python 数学演算 組込み関数

Pythonで2進数/8進数/16進数および10進数へ変換する方法として、

  • 標準組み込み関数:bin(), hex(), oct()およびint()を使う
  • format()やf-stringでPythonの書式設定(typeパラメータ)を使う

があります。それぞれ入力値や戻り値のデータ型が異なります。
本記事ではこれらの方法と特徴について具体例を交えて丁寧に解説します。

標準組み込み関数を使う方法:bin(), oct(), hex(), int()

Pythonの標準組み込み関数には、2進数、8進数、16進数、そして10進数へ変換するための関数が用意されています。
それぞれの関数の入力値と戻り値のデータ型と併せて、下表にまとめました。

関数 入力値の型 戻り値の型 備考
2進数へ変換 bin(x) 整数型 文字列型 返り値は接頭辞”0b”付き
8進数へ変換 oct(x) 整数型 文字列型 返り値は接頭辞”0o”付き
16進数へ変換 hex(x) 整数型 文字列型 返り値は接頭辞”0x”付き
10進数へ変換 index(x, base=2/8/16) 文字列 整数型

次項より具体例を用いて詳細を解説します。

2進数へ変換:bin()

組込み関数bin() は、整数型を2進数に変換します。
返り値は、接頭辞 0bが付いた文字列です。

# 10進数 → 2進数
# 入力は整数型
>>> num = 10
>>> bin(num)
'0b1010'

# 負の数値の場合
>>> num = -10
>>> bin(num)
'-0b1010'

# 8進数 → 2進数
>>> num = 0o12
>>> bin(num)
'0b1010'

# 16進数 → 2進数
>>> num = 0xa
>>> bin(num)
'0b1010'

8進数へ変換:oct()

組込み関数oct() は、整数型を8進数に変換します。
返り値は、接頭辞 0oが付いた文字列です。

# 10進数 → 8進数
# 入力は整数型
>>> num = 10
>>> oct(num)
'0o12'

# 負の数値の場合
>>> num = -10
>>> oct(num)
'-0o12'

# 2進数 → 8進数
>>> num = 0b1010
>>> oct(num)
'0o12'

# 16進数 → 8進数
>>> num = 0xa
>>> oct(num)
'0o12'

16進数へ変換:hex()

組込み関数hex() は、整数型を16進数に変換します。
返り値は、接頭辞 0xが付いた文字列です。

# 10進数 → 16進数
# 入力は整数型
>>> num = 10
>>> hex(num)
'0xa'

# 負の数値の場合
>>> num = -10
>>> hex(num)
'-0xa'

# 2進数 → 16進数
>>> num = 0b1010
>>> hex(num)
'0xa'

# 8進数 → 16進数
>>> num = 0o12
>>> hex(num)
'0xa'

10進数へ変換:int()

標準組み込み関数int() を使うと、10進数への変換が出来ます。

  • 入力は文字列型です。
    ※例えば浮動小数点型→整数型のような変換の場合とは異なりますので注意です。
  • 第二引数baseに、何進数に変換したいかを設定します。
  • 戻りは整数型です。

尚、入力値に接頭辞0bは有っても無くても変換されます。

# 2進数 → 10進数
# 入力は文字列型
>>> num = '1010'
>>> int(num, base=2)
10

# 接頭辞がついていても変換できます
>>> num = "0b1010"
>>> int(num, base=2) # base = 2に設定
10

# 8進数 → 10進数
>>> num = '12'
>>> int(num, base=8) # base = 8に設定
10

# 16進数 → 10進数
>>> num = 'a'
>>> int(num, base=16) # base = 16に設定
10

引数baseがある時に第一引数が数値の場合はTypeErrorとなります。

>>> num = 0b1010
>>> int(num, base=2)
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
TypeError: int() can't convert non-string with explicit base

参考記事)【Python】 数値型の基本について(int, float, complex) | 整数型:int() | 何進数で解釈するか?

Pythonの書式設定(typeパラメータ)を使う

format()やf-stringで出力の書式設定をする際に、typeパラメータを設定することで、n進数への変換が可能です。
この場合は、入力は整数型ですが、戻り値は文字列となります。

typeパラメータの値 設定例 入力値の型 戻り値の型
2進数へ変換 b ‘{:b}’ (接頭辞0b付き:’{#b}’) 整数型 文字列
8進数へ変換 o ‘{:o}’ (接頭辞0o付き:’{#o}’) 整数型 文字列
16進数へ変換 x ‘{:x}’ (接頭辞0x付き:’{#x}’) 整数型 文字列
10進数へ変換 d ‘{:d}’ (接頭辞無し) 整数型 文字列

以下に、具体例を用いて詳細を解説します。

format()を使った書式設定

  • 入力値(変換元の値)は整数型で指定します。
    2進数であれば接頭辞0b、8進数なら0o、16進数なら0xを付けます。
  • Pythonの書式指定のtypeパラメータを用いてn進数に変換します(パラメータの設定値は上表を参照)。
  • 戻り値は文字列型です。
  • 参考記事)【Python】formatを用いた書式設定の基本

    10進数 → 2進数

    >>> num = 10 # 入力は整数型
    >>> '{:b}'.format(num)
    '1010'
    
    # 接頭辞0b付きで出力
    >>> '{:#b}'.format(num)
    '0b1010'

    入力する値が文字列の場合はValueErrorとなります。

    >>> num = '10'
    >>> '{:b}'.format(num)
    Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
    ValueError: Unknown format code 'b' for object of type 'str'

    2進数 → 10進数

    >>> num = 0b1010 # 接頭辞0bを付ける
    >>> '{:d}'.format(num)
    '10'
    
    # 接頭辞0bを付けないと、(当たり前ですが)2進数として扱われません
    >>> num = 1010
    >>> '{:d}'.format(num)
    '1010'

    10進数 → 8進数

    >>> num = 10
    >>> '{:o}'.format(num)
    '12'
    
    # 接頭辞0o付きで出力
    >>> '{:#o}'.format(num)
    '0o12'

    8進数 → 10進数

    >>> num = 0o12  # 接頭辞0oを付ける
    >>> '{:d}'.format(o)
    '10'

    10進数 → 16進数

    >>> num = 10
    >>> '{:x}'.format(num)
    'a'
    
    # 接頭辞0x付きで出力
    >>> '{:#x}'.format(num)
    '0xa'

    16進数 → 10進数

    >>> num = 0xa # 接頭辞0xを付ける
    >>> '{:d}'.format(num)
    '10'

    2進数 → 8進数

    あまり使わないかもしれませんが、こんな変換も可能。

    >>> num = 0b1010
    >>> '{:o}'.format(num)
    '12'

    f-stringを使った書式設定

    書式設定部分はformat()と同じです。

    参考記事)【Python】 f-stringの使い方の基本

    10進数 → 2進数

    >>> num = 10 # 入力は整数型
    >>> f'{num:b}'
    '1010'
    
    # 接頭辞0b付きで出力
    >>> f'{num:#b}'
    '0b1010'

    入力する数値が文字列の場合はValueErrorとなります。

    >>> num = '10'
    >>> f'{num:b}'
    Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
    ValueError: Unknown format code 'b' for object of type 'str'

    2進数 → 10進数

    >>> num = 0b1010 # 接頭辞0bを付ける
    >>> f'{num:d}'
    '10'

    10進数 → 8進数

    >>> num = 10
    >>> f'{num:o}'
    '12'
    
    # 接頭辞0o付きで出力
    >>> f'{num:#o}'
    '0o12'

    8進数 → 10進数

    >>> num = 0o12  # 接頭辞0oを付ける
    >>> f'{num:d}'
    '10'

    10進数 → 16進数

    >>> num = 10
    >>> f'{num:x}'
    'a'
    
    # 接頭辞0x付きで出力
    >>> f'{num:#x}'
    '0xa'

    16進数 → 10進数

    >>> num = 0xa # 接頭辞0xを付ける
    >>> f'{num:d}'
    '10'

    2進数 → 8進数

    >>> num = 0b1010
    >>> f'{num:o}'
    '12'

    確認した環境

    • OS: Ubuntu18.04LTS
    • Python3.7.4

    まとめ

    数値を2進数/8進数/16進数および10進数への変換する方法についてまとめました。

    • 標準組み込み関数:bin(), oct(), hex()、int()
    • format()やf-stringで、pythonの書式設定を使う

    それぞれ変換したいデータ型(文字列や数値型)や戻り値の型が異なるので、場面によって適切に選択することができますね。

    Learn more...

    書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

    シェアする
    ひびきをフォローする
    Hbk project