Pythonでバイナリリテラルをどのように表現しますか?


351

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進数の古い構文は許可されなくなります。

回答:


291

参考のために— 将来の Pythonの可能性:
Python 2.6以降、接頭辞0bまたは0Bを使用してバイナリリテラルを表現できます。

>>> 0b101111
47

新しいbin関数を使用して、数値のバイナリ表現を取得することもできます。

>>> bin(173)
'0b10101101'

ドキュメントの開発バージョン:Python 2.6の新機能


72
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255

別の方法。


2
これは文字列がある場合に興味深いですが、純粋な数値を扱う場合、コードに不要な計算を追加します。
DanielMöller2017

28

Pythonでバイナリリテラルをどのように表現しますか?

これらは「バイナリ」リテラルではなく、「整数リテラル」です。整数リテラルは、一連のゼロと1が後に続く0Bまたはb後に続くバイナリ形式で表現できます。次に例を示します。

>>> 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"

使用可能なメモリに格納できるものを除いて、整数リテラルの長さに制限はありません。

0以外の10進数の先行ゼロは許可されないことに注意してください。これは、Pythonがバージョン3.0より前に使用していたCスタイルの8進数リテラルを明確にするためです。

整数リテラルの例:

7     2147483647                        0o177    0b100110111
3     79228162514264337593543950336     0o377    0xdeadbeef
      100_000_000_000                   0b_1110_0101

バージョン3.6で変更:リテラルでグループ化するためにアンダースコアを使用できるようになりました。

バイナリを表現する他の方法:

操作可能な文字列オブジェクトに0と1を含めることができます(ほとんどの場合、整数に対してビット単位の演算を行う必要があります)-0と1の文字列、および変換元の(2 ):

>>> 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'

2

最初の0は、ベースが8(10ではない)であることを示しています。

>>> int('010101', 0)
4161

0から始めない場合、Pythonは数値が10を基数と見なします。

>>> int('10101', 0)
10101

-1

私が知る限り、2.5までのPythonでは、16進数と8進数のリテラルのみがサポートされています。私は将来のバージョンにバイナリを追加することについていくつかの議論を見つけましたが、明確なものは何もありませんでした。


-3

これは、おそらくbin()がhex()およびoct()に対応するようにPython 3.0が変更されたことによるものの1つであると確信しています。

編集:lbrandyの答えはすべての場合において正しいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.