note.nkmk.me

Pythonで2進数、8進数、16進数の数値・文字列を相互に変換

Date: 2017-08-21 / Modified: 2018-03-14 / tags: Python, 文字列操作

Pythonでは通常の10進数だけでなく2進数、8進数、16進数として数値や文字列を扱うことができる。相互に変換するのも簡単。

ここでは、

  • 整数を2進数、8進数、16進数で記述
  • 数値を2進数、8進数、16進数表記の文字列に変換
    • 組み込み関数bin(), oct(), hex()
    • 組み込み関数format()または文字列メソッドstr.format()
    • 負の整数を2の補数形式の文字列に変換
  • 2進数、8進数、16進数表記の文字列を数値に変換
    • 組み込み関数int()
  • 活用例
    • 2進数の文字列の演算
    • 2進数、8進数、16進数の相互変換

について、サンプルコードとともに説明する。

整数ではなく浮動小数点数float型を16進数の文字列に変換したい場合は以下の記事を参照。

スポンサーリンク

整数を2進数、8進数、16進数で記述

プレフィックス0b, 0o, 0xをつけると、整数型intの数値をそれぞれ2進数、8進数、16進数として扱うことができる。

bin_num = 0b10
oct_num = 0o10
hex_num = 0x10

print(bin_num)
print(oct_num)
print(hex_num)
# 2
# 8
# 16

大文字0B, 0O, 0XでもOK。

Bin_num = 0B10
Oct_num = 0O10
Hex_num = 0X10

print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16

プレフィックスがついていても、型としては整数型int

print(type(bin_num))
print(type(oct_num))
print(type(hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>

print(type(Bin_num))
print(type(Oct_num))
print(type(Hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>

整数型なので、そのまま普通に四則演算が可能。

result = 0b10 * 0o10 + 0x10
print(result)
# 32

Python3.6からは数値中にアンダースコア_を挿入できるようになった。アンダースコア_を繰り返すとエラーになるが、繰り返さなければ何個挿入してもよい。

アンダースコア_は数値に影響しないので桁数が多い場合などの区切りとして使える。例えば4桁ごとに_を入れると見やすい。

print(0b111111111111 is 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

数値を2進数、8進数、16進数表記の文字列に変換

数値を2進数、8進数、16進数表記の文字列に変換するには、

  • 組み込み関数bin(), oct(), hex()
  • 組み込み関数format()または文字列メソッドstr.format()

を使う。

負の値に対して2の補数形式で表現された文字列を取得する方法についても説明する。

組み込み関数bin(), oct(), hex()

組み込み関数bin(), oct(), hex()で、数値を2進数、8進数、16進数の文字列に変換できる。それぞれプレフィックス0b, 0o, 0xがついた文字列を返す。

i = 255

bin_str = bin(i)
oct_str = oct(i)
hex_str = hex(i)

print(bin_str)
print(oct_str)
print(hex_str)
# 0b11111111
# 0o377
# 0xff

print(type(bin_str))
print(type(oct_str))
print(type(hex_str))
# <class 'str'>
# <class 'str'>
# <class 'str'>

組み込み関数format()または文字列メソッドstr.format()

組み込み関数format()、または、文字列メソッドstr.format()でも、数値を2進数、8進数、16進数の文字列に変換できる。

第二引数の書式化指定文字列にb, o, xを指定することで、それぞれ2進数、8進数、16進数の文字列に変換できる。

bin_str = format(i, 'b')
oct_str = format(i, 'o')
hex_str = format(i, 'x')

print(bin_str)
print(oct_str)
print(hex_str)
# 11111111
# 377
# ff

print(type(bin_str))
print(type(oct_str))
print(type(hex_str))
# <class 'str'>
# <class 'str'>
# <class 'str'>

プレフィックス0b, 0o, 0xがついた文字列を取得したい場合は書式化指定文字列に#をつける。

bin_str = format(i, '#b')
oct_str = format(i, '#o')
hex_str = format(i, '#x')

print(bin_str)
print(oct_str)
print(hex_str)
# 0b11111111
# 0o377
# 0xff

任意の桁数で0埋めすることも可能。プレフィックスをつけて0埋めする場合はプレフィックスの分の文字数(2文字)も考慮する必要があるので注意。

bin_str = format(i, '08b')
oct_str = format(i, '08o')
hex_str = format(i, '08x')

print(bin_str)
print(oct_str)
print(hex_str)
# 11111111
# 00000377
# 000000ff

bin_str = format(i, '#010b')
oct_str = format(i, '#010o')
hex_str = format(i, '#010x')

print(bin_str)
print(oct_str)
print(hex_str)
# 0b11111111
# 0o00000377
# 0x000000ff

文字列メソッドstr.format()でも同様に変換できる。

print('bin is {:08b}'.format(i))
print('oct is {:08o}'.format(i))
print('hex is {:08x}'.format(i))
# bin is 11111111
# oct is 00000377
# hex is 000000ff

書式化指定文字列の種類や書き方など、format(), str.format()についての詳細は以下の記事を参照。

負の整数を2の補数形式の文字列に変換

負の整数をbin()format()などで2進数や16進数の文字列に変換すると、絶対値にマイナス符号が付いた形になる。

2の補数形式で表現された文字列を取得したい場合は、4bitなら0b1111(=0xf)、8bitなら0xff、16bitなら0xffffのように、必要なビット桁数の最大値との論理積&を取る。

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

2進数、8進数、16進数表記の文字列を数値に変換

2進数、8進数、16進数表記の文字列を数値に変換するには、

  • 組み込み関数int()

を使う。

組み込み関数int()

int(文字列, 基数)で基数をもとに2進数、8進数、16進数表記の文字列strを数値intに変換できる。基数を省略した場合は10進数とみなされる。

dec_num = int('10')
bin_num = int('10', 2)
oct_num = int('10', 8)
hex_num = int('10', 16)

print(dec_num)
print(bin_num)
print(oct_num)
print(hex_num)
# 10
# 2
# 8
# 16

print(type(dec_num))
print(type(bin_num))
print(type(oct_num))
print(type(hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>
# <class 'int'>

基数を0にすると、文字列のプレフィックス(0b, 0o, 0xまたは0B, 0O, 0X)をもとに変換される。

dec_num = int('10', 0)
bin_num = int('0b10', 0)
oct_num = int('0o10', 0)
hex_num = int('0x10', 0)

print(dec_num)
print(bin_num)
print(oct_num)
print(hex_num)
# 10
# 2
# 8
# 16

Bin_num = int('0B10', 0)
Oct_num = int('0O10', 0)
Hex_num = int('0X10', 0)

print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16

活用例

2進数の文字列の演算

例えば、プレフィックス0bが付いた2進数表記の文字列の演算を行う場合。

数値(整数型int)に変換して演算し、ふたたび文字列strに戻すといった操作が簡単に行える。

a = '0b1001'
b = '0b0011'

c = int(a, 0) + int(b, 0)

print(c)
print(bin(c))
# 12
# 0b1100

2進数、8進数、16進数の相互変換

2進数、8進数、16進数の文字列をそれぞれ相互に変換することも簡単。一度数値intに変換したあと任意の書式の文字列に変換すればよい。

0埋めやプレフィックスの有無などは書式化指定文字列で制御できる。

a_0b = '0b1110001010011'

a_0x = format(int(a, 0), '#010x')
a_0o = format(int(a, 0), '#010o')
print(a_0x)
print(a_0o)
# 0x00000009
# 0o00000011
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事