Python でバイナリ リテラルを表現するにはどうすればよいですか?
質問
Python リテラルを使用して整数を 2 進数として表現するにはどうすればよいでしょうか?
16 進数の答えは簡単に見つかりました。
>>> 0x12AF
4783
>>> 0x100
256
および 8 進数:
>>> 01267
695
>>> 0100
64
Python でリテラルを使用してバイナリを表現するにはどうすればよいですか?
回答の概要
- Python 2.5 以前:を使用してバイナリを表現できます
int('01010101111',2)
ただしリテラルではありません。 - Python 2.5 以前:がある とんでもない バイナリリテラルを表現します。
- Python 2.6 ベータ版:次のようにすることができます:
0b1100111
または0B1100111
. - Python 2.6 ベータ版:も許可します
0o27
または0O27
(2 番目の文字は文字 O) 8 進数を表します。 - Python 3.0 ベータ版:2.6 と同じですが、古いバージョンは使用できなくなります
027
8 進数の構文。
解決
参考のため-未来 Python の可能性:
Python 2.6 以降では、プレフィックスを使用してバイナリ リテラルを表現できます。 0b または 0B:
>>> 0b101111
47
新しいものも使用できます 置き場 数値のバイナリ表現を取得する関数:
>>> bin(173)
'0b10101101'
ドキュメントの開発バージョン: Python 2.6 の新機能
他のヒント
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255
別の方法。
Python でバイナリ リテラルを表現するにはどうすればよいですか?
これらは「バイナリ」リテラルではなく、「整数リテラル」です。整数リテラルをバイナリ形式で表現するには、 0
続いて B
または b
次に、一連の 0 と 1 が続きます。例:
>>> 0b0010101010
170
>>> 0B010101
21
Python 3 から ドキュメント, 、Python で整数リテラルを提供する方法は次のとおりです。
整数リテラルは、次の字句定義によって記述されます。
integer ::= decinteger | bininteger | octinteger | hexinteger decinteger ::= nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")* bininteger ::= "0" ("b" | "B") (["_"] bindigit)+ octinteger ::= "0" ("o" | "O") (["_"] octdigit)+ hexinteger ::= "0" ("x" | "X") (["_"] hexdigit)+ nonzerodigit ::= "1"..."9" digit ::= "0"..."9" bindigit ::= "0" | "1" octdigit ::= "0"..."7" hexdigit ::= digit | "a"..."f" | "A"..."F"
利用可能なメモリに保存できるものとは別に、整数リテラルの長さに制限はありません。
ゼロ以外の 10 進数の先頭にゼロは許可されないことに注意してください。これは、Pythonがバージョン3.0の前に使用したCスタイルのオクタルリテラルを使用した乱用のためです。
整数リテラルの例をいくつか示します。
7 2147483647 0o177 0b100110111 3 79228162514264337593543950336 0o377 0xdeadbeef 100_000_000_000 0b_1110_0101
バージョン 3.6 で変更された点: リテラルでグループ化の目的でアンダースコアを使用できるようになりました。
バイナリを表現する他の方法:
操作可能な文字列オブジェクトに 0 と 1 を含めることができます (ただし、ほとんどの場合は整数に対してビット単位の操作を行う必要があります)。0 と 1 の文字列と変換元の基数 (2) を int に渡すだけです。 ):
>>> int('010101', 2)
21
オプションで、 0b
または 0B
接頭辞:
>>> int('0b0010101010', 2)
170
合格すれば 0
文字列に接頭辞が指定されていない場合は、基数として 10 が想定されます。
>>> int('10101', 0)
10101
>>> int('0b10101', 0)
21
int から人間が読み取り可能なバイナリに変換します。
整数を bin に渡すと、バイナリ リテラルの文字列表現を確認できます。
>>> bin(21)
'0b10101'
そして組み合わせることができます bin
そして int
行ったり来たりするには:
>>> bin(int('010101', 2))
'0b10101'
先頭にゼロを付けて幅を最小にしたい場合は、形式指定も使用できます。
>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'
ここでの先頭の 0 は、基数が 8 (10 ではない) であることを指定しています。これは非常に簡単にわかります。
>>> int('010101', 0)
4161
0 で始まらない場合、Python はその数値が基数 10 であると想定します。
>>> int('10101', 0)
10101
私の知る限り、Python は 2.5 までは 16 進数と 8 進数のリテラルのみをサポートしています。将来のバージョンにバイナリを追加することについての議論はいくつか見つかりましたが、明確なものは何もありませんでした。
これは Python 3.0 での変更によるもので、おそらく hex() と oct() に加えて bin() が変更されたことによるものだと私は確信しています。
編集:lbrandy の答えはすべての場合に正しいです。