[解決!Python]整数値(10進数値)を2進数表現に変換するには解決!Python

Pythonで整数値(int型)の値を2進数表現に変換するには幾つかの方法がある。その中からbin関数を使う方法と文字列の書式指定を使って変換する方法を紹介する。

» 2024年02月27日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「解決!Python」のインデックス

連載目次

n = 481

# bin関数で2進数に変換
result = bin(n)  # 戻り値は文字列であることに注意
print(result)  # 0b111100001
print(type(result))  # <class 'str'>

# 書式指定文字列のformat_specフィールドのtypeオプションに'b'を指定
result = f'{n:b}'
print(result)  # 111100001

result = '{0:b}'.format(n)
print(result)  # 111100001

result = format(n, 'b')
print(result)  # 111100001

# 2進数であることを意味する'0b'を含めたい
result = f'{n:#b}'
print(result)  # 0b111100001

# 最小文字数を指定したい
result = f'{n:#16b}'  # 最小文字数を指定
print(result)  #      0b111100001

# 0埋めしたい
result = f'{n:0=#16b}'  # 0埋め
print(result)  # 0b00000111100001

result = f'{n:#016b}'  # 上と同じ
print(result)  # 0b00000111100001

# 符号の表記を指定したい
n = 481

result = f'{n:+#16b}'  # 常に符号を含める
print(result)  #     +0b111100001

result = f'{n:+#016b}'  # 常に符号を含め、符号の後を0埋め
print(result)  # +0b0000111100001

n = 481  # 正数

result = f'{n:-#016b}'  # 正数では符号を含めず、負数では符号を含める
print(result)  # 0b00000111100001

n = -379  # 負数
result = f'{n:-#016b}'
print(result)  # -0b0000101111011

n = 481  # 正数

result = f'{n: #016b}'  # 正数では符号の位置に空白文字を、負数では符号を含める
print(result)  #  0b0000111100001

n = -379  # 負数
result = f'{n: #016b}'
print(result)  # -0b0000101111011

# 4桁ごとにアンダースコアを含めたい
n = 481

result = f'{n:#016_b}'  # 4桁ごとにアンダースコアを含める
print(result)  # 0b0001_1110_0001

result = f'{n:#08_b}'  # widthオプションに8を指定して0埋め
print(result)  # 0b1_1110_0001


したいこと 方法
単純に変換したい bin関数を使う。文字列の書式指定でtypeオプションに’b’を指定
'0b'を表示したい 文字列の書式指定で'#'を指定
最小文字数を指定したい 文字列の書式指定でwidthオプションに桁数を指定
先頭を0埋めしたい 文字列の書式指定でfillオプションに'0'/alignオプションに'='を指定
桁数を指定するwidthオプションに'0'を前置
符号の表記を指定したい 文字列の書式指定でsignオプションに'+'(常に符号を含める)、'-'(負数にのみ符号を含める)、' '(正数では符号の代わりに空白文字を、負数では符号を含める)のいずれかを指定する
4桁ごとにアンダースコアを含めたい 文字列の書式指定でgrouping_optionに'_'を指定
10進数値を2進数表現に変換するときに指定可能な書式指定文字列のオプション

10進数値を2進数表現に変換する方法

 Pythonで10進数値を2進数値(2進数表現)に変換するには幾つかの方法がある。

  • bin関数を呼び出す
  • f文字列や文字列のformatメソッド、format関数で指定可能な書式指定文字列のformat_specフィールドのtypeオプションに'b'を指定する

 bin関数に整数値を渡すと、その2進表現が文字列として返される。

n = 481

# 2進数に変換
result = bin(n)  # 戻り値は文字列であることに注意
print(result)  # 0b111100001
print(type(result))  # <class 'str'>


 戻り値は2進数表現であることを意味する'0b'で始まり、その後に実際の2進数表現が続く。

書式指定文字列のformat_specを使って変換する

 f文字列やformatメソッドの書式指定文字列のtypeオプションに'b'を指定することでも、整数値を2進数表現に変換できる。以下に例を示す。

result = f'{n:b}'
print(result)  # 111100001

result = '{0:b}'.format(n)
print(result)  # 111100001

result = format(n, 'b')
print(result)  # 111100001


 最初の例はf文字列を使ったものだ。コロン「:」に続くformat_specフィールドのtypeオプションに'b'を指定している(他のオプションは全て省略)。次の例では文字列のformatメソッドを使っている。この例では置換フィールドの名前に'0'を指定しているが、実際にはこれは省略したり、他の名前を付けたりすることも可能だ(説明は割愛)。最後の例はformat関数に変換したい値と書式指定を渡している。上の2つの例ではコロンに続けて記述している書式指定をそのまま記述していることに注意されたい。

 書式指定文字列のformat_specフィールドはおおよそ次のような形で指定する(10進数を2進数表現に変換する場合)。

[[fill]align][sign]['#']['0'][width][grouping_option][type]


 これらは次のような意味を持つ(全て省略可。全てを省略した場合は単に、値が文字列化されるだけとなる)。

オプション 説明
fill 文字埋めする場合に使われる文字を指定
align widthオプションに指定した文字数内における変換後の値の文字寄せ(左寄せ:'<'、右寄せ:'>'、中央寄せ:'^'、符号の後を文字埋め:'=')
sign 常に符号を含める('+')、負数だけ符号を含める('-')、正数の場合は空白文字を負数の場合は符号を含める(' ')
'#' 2進数であることを意味する'0b'を含める
'0' widthオプションで指定した文字数内で0埋めすることを指定(fillオプションに'0'を、alignオプションに'='を指定したのと同様)
width 変換後の文字列の最小文字数を指定
grouping_option 4桁ごとにアンダースコアを含めるときにはここに'_'を指定
type 'b'を指定することで2進数表現に変換される
10進数値を2進数表現に変換する際のformat_specの指定

 以下では主にf文字列を例として、10進数値を2進数表現に変換する際に指定可能なさまざまなオプションを紹介していく。

2進数であることを意味する'0b'を含めたい

 2進数であることを意味する'0b'を、変換後の文字列に含めるときには'#'オプションを指定する。以下に例を示す。

result = f'{n:#b}'
print(result)  # 0b111100001


最小文字数を指定したい

 変換後の2進数表現の最小文字数を指定するにはwidthオプションを指定する。以下に例を示す。

result = f'{n:#16b}'  # 最小文字数を指定
print(result)  #      0b111100001


 この例では最小文字数として「16」を指定している。変換後の文字列は11文字なので余った部分は空白文字になっている。

0埋めしたい

 上記のように変換後の2進数表現の文字数が最小文字数に満たない場合に、0埋めしたいのであれば、fillオプションに'0'を、alignオプションに'='(符号の後ろを文字埋め)を指定する。以下に例を示す。

result = f'{n:0=#16b}'  # 0埋め
print(result)  # 0b00000111100001


 '0='は'#'の後に'0'と最小文字数を指定するのと同じ効果を持つので、上のコードは次のようにも書ける。

result = f'{n:#016b}'  # 上と同じ
print(result)  # 0b00000111100001


 なお、fillオプションに'0'を、alignオプションに'>'(右寄せ)を指定すると次のようになる。

result = f'{n:0>#16b}'  # 0埋めで右寄せ
print(result)  # 000000b111100001


 '0b'の前が0埋めされてしまっているので、'#'を指定した場合のalignオプションは'='にするのがよいだろう。

符号の表記方法を指定したい

 変換後の2進数表記に符号をどのように含めるかはsignオプションで指定できる。

  • '+':常に符号を含める
  • '-':負数には符号を含める
  • ' ':正数では符号位置に空白文字を含め、負数では符号を含める

 以下は'+'を指定した例だ。

n = 481

result = f'{n:+#16b}'  # 常に符号を含める
print(result)  #     +0b111100001

result = f'{n:+#016b}'  # 常に符号を含め、符号の後を0埋め
print(result)  # +0b0000111100001


 最初の例では符号の前が空白文字となっている点に注目されたい。これは0埋めを指定する'0'や'0='が指定されていないからだ。そうではなく、符号の後を0埋めしたいのであれば、次の例のように'0'に続けて最小文字数を指定する(か、fillオプションとalignオプションを'0='にする)。

 '-'を指定する例を以下に示す。

n = 481  # 正数

result = f'{n:-#016b}'  # 正数では符号を含めず、負数では符号を含める
print(result)  # 0b00000111100001

n = -379  # 負数
result = f'{n:-#016b}'
print(result)  # -0b0000101111011


 正数では符号が含まれず、負数では符号が含まれていることを確認されたい。

 最後に' 'を指定した場合の例だ。

n = 481  # 正数

result = f'{n: #016b}'  # 正数では符号の位置に空白文字を、負数では符号を含める
print(result)  #  0b0000111100001

n = -379  # 負数
result = f'{n: #016b}'
print(result)  # -0b0000101111011


 '-'を指定したときとは異なり、正数では符号部分に空白文字が表示されている点に注目されたい('0b'に続く'0'の数が違うことで確認できる)。

4桁ごとにアンダースコアを含めたい

 2進数表記は桁数が多くなるので、4桁ごとにアンダースコアを含めると見やすくなる場合がある。そうするにはgrouping_optionオプションに'_'を指定する。以下に例を示す。

n = 481

result = f'{n:#016_b}'  # 4桁ごとにアンダースコアを含める
print(result)  # 0b0001_1110_0001


 なお、変換後の2進数表現がwidthオプションに指定した文字数よりも長くなった場合は、widthオプションの値を超える文字数となる。

result = f'{n:#08_b}'  # widthオプションに8を指定して0埋め
print(result)  # 0b1_1110_0001


 この例ではwidthオプションに8を指定しているが、変換後の文字列は13文字となる。widthオプションに指定するのはあくまでも最小文字数であることに注意しよう。また、このときには0埋めは行われない点にも注意が必要だ。

「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。