Pythonのbin()関数を使用して整数をバイナリに変換しようとしています。ただし、実際に必要な先行ゼロは常に削除されるため、結果は常に8ビットになります。
例:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
これを行う方法はありますか?
Pythonのbin()関数を使用して整数をバイナリに変換しようとしています。ただし、実際に必要な先行ゼロは常に削除されるため、結果は常に8ビットになります。
例:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
これを行う方法はありますか?
回答:
format()
関数を使用します。
>>> format(14, '#010b')
'0b00001110'
format()
この関数は、単純に以下の入力フォーマットフォーマット仕様のミニ言語を。これ#
により、フォーマットに0b
接頭辞が含まれ、010
サイズによって出力が10文字幅に収まるように0
パディングされます。0b
接頭辞には2文字、2進数には残りの8文字。
これは最もコンパクトで直接的なオプションです。
結果をより大きな文字列に入れる場合は、フォーマットされた文字列リテラル(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'
format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b')
11000000.00000000.00000010.00100001
str.format()
、プレースホルダーのコロンの後にformat()関数の2番目の引数を使用して配置することを明示します{:..}
:
f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"
。
>>> '{:08b}'.format(1)
'00000001'
Python 2.6以前の:
場合、前に位置引数識別子を省略できないため、次のように使用します
>>> '{0:08b}'.format(1)
'00000001'
str.format()
いつformat()
行うかはここで使用する必要はありません。0b
プレフィックスがありません。
str.format
よりも柔軟性がありformat()
ます。そのformat
機能が存在することすら忘れてしまいます。確かに、この場合は完全に適切です。
str.format()
1つだけ使用して{}
他のテキストは使用せず、文字列テンプレートを使用せず、1つの値をフォーマットします。その場合はを使用してくださいformat()
。:-)
文字列形式のミニ言語を使用できます。
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))
#
ます。もありformat()
ます。これにより、完全な文字列テンプレートを実行する必要がなくなります。
Pythonを使用する場合>= 3.6
、最もクリーンな方法は、文字列フォーマットでf-stringsを使用することです。
>>> var = 23
>>> f"{var:#010b}"
'0b00010111'
説明:
var
フォーマットする変数:
この後のすべてがフォーマット指定子です#
代替形式を使用(0b
接頭辞を追加)0
ゼロで埋める10
全長が10になるようにパッドします(これにはの2文字が含まれます0b
)b
数値にバイナリ表現を使用するformat(var, "#010b")
伝達されます。ただし、これは最速のオプションです。しかし、あなたが知っていることはすでにわかっています。私があなたが私の回答に投稿したものすべてをすでにカバーしているからです。
シンプルなワンライナーが必要な場合もあります。
binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])
Python 3
[ ]
必要ないことに注意してください- join()
ジェネレータ式を受け入れます。''.join('{0:08b}'.format(ord(x)) for x in input)
str.join()
は、2つのパスを作成する必要があるため、結合する前に、ジェネレーターの入力が最初にリストに変換されることに注意してください。これはパフォーマンスに少し負荷がかかりますが、実際には、ジェネレータ式ではなくリスト内包を渡す方が適切です。彼らがルールの例外であるなら、それは一つです。
あなたはこのようなものを使うことができます
("{:0%db}"%length).format(num)
"{:0{l}b}".format(num, l=length)
Python構文のrjust文字列メソッドを使用できます:string.rjust(length、fillchar)fillcharはオプションです
そしてあなたの質問のためにあなたはこのように書きます
'0b'+ '1'.rjust(8,'0)
したがって、「0b00000001」になります
int
をテキストのバイナリ表現に変換することに関する質問にはまったく答えません。で始まることすらありませんint
。
zfillを使用できます。
print str(1).zfill(2)
print str(10).zfill(2)
print str(100).zfill(2)
プリント:
01
10
100
数値を出力するときだけでなく、変数に割り当てる必要があるときにも役立つので、このソリューションが好きです。例:-x = str(datetime.date.today()。month).zfill(2)は、 2月にxを '02'として返します。
bin(14)
、bin(14).zfill(8)
`'0b1110'` を与え、 `'0b00001110'` を 与えます