Pythonでbin()関数を使用して整数をバイナリに変換しようとしています。ただし、結果が常に8ビットになるように、実際に必要な先行ゼロは常に削除されます。
例:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
これを行う方法はありますか?
format()
function を使用します。
>>> format(14, '#010b')
'0b00001110'
format()
関数は、 Format Specification mini language に従って入力をフォーマットするだけです。 #
は、形式に0b
プレフィックスを含め、010
サイズは、0
パディングを使用して、10文字幅に収まるように出力をフォーマットします。 0b
プレフィックスには2文字、2進数には残りの8文字。
これは最もコンパクトで直接的なオプションです。
結果をより大きな文字列に入れる場合は、 formatted string literal (3.6+)を使用するか、 str.format()
を使用し、format()
関数の2番目の引数をコロンの後に置きますプレースホルダー{:..}
:
>>> value = 14
>>> f'The produced output, in binary, is: {value:#010b}'
'The produced output, in binary, is: 0b00001110'
>>> 'The produced output, in binary, is: {:#010b}'.format(value)
'The produced output, in binary, is: 0b00001110'
たまたま、単一の値をフォーマットするだけの場合でも(結果を大きな文字列に入れずに)、フォーマットされた文字列リテラルを使用するほうがformat()
を使用するよりも高速です。
>>> import timeit
>>> timeit.timeit("f_(v, '#010b')", "v = 14; f_ = format") # use a local for performance
0.40298633499332936
>>> timeit.timeit("f'{v:#010b}'", "v = 14")
0.2850222919951193
しかし、format(...)
が意図をより良く伝えるため、タイトループでのパフォーマンスが重要な場合にのみ、これを使用します。
0b
プレフィックスが必要ない場合は、単に#
をドロップして、フィールドの長さを調整します。
>>> format(14, '08b')
'00001110'
>>> '{:08b}'.format(1)
'00000001'
参照: フォーマット仕様ミニ言語
Python 2.6以前の場合、:
の前に位置引数識別子を省略することはできませんので、
>>> '{0:08b}'.format(1)
'00000001'
使ってます
bin(1)[2:].zfill(8)
印刷します
'00000001'
文字列フォーマットミニ言語を使用できます。
def binary(num, pre='0b', length=8, spacer=0):
return '{0}{{:{1}>{2}}}'.format(pre, spacer, length).format(bin(num)[2:])
デモ:
print binary(1)
出力:
'0b00000001'
編集:@ Martijn Pietersのアイデアに基づいて
def binary(num, length=8):
return format(num, '#0{}b'.format(length + 2))
時には、単純なライナーが1つだけ必要な場合があります。
binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])
Python 3
このようなものを使用できます
("{:0%db}"%length).format(num)