web-dev-qa-db-ja.com

バイナリに変換し、Pythonの先行ゼロを保持します

Pythonでbin()関数を使用して整数をバイナリに変換しようとしています。ただし、結果が常に8ビットになるように、実際に必要な先行ゼロは常に削除されます。

例:

bin(1) -> 0b1

# What I would like:
bin(1) -> 0b00000001

これを行う方法はありますか?

115

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'
160
Martijn Pieters
>>> '{:08b}'.format(1)
'00000001'

参照: フォーマット仕様ミニ言語


Python 2.6以前の場合、:の前に位置引数識別子を省略することはできませんので、

>>> '{0:08b}'.format(1)
'00000001'      
96
bwbrowning

使ってます

bin(1)[2:].zfill(8)

印刷します

'00000001'
19
rekinyz

文字列フォーマットミニ言語を使用できます。

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))
8
Peter Varo

時には、単純なライナーが1つだけ必要な場合があります。

binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])

Python 3

1
Mark

このようなものを使用できます

("{:0%db}"%length).format(num)
0
Adam