Python'daki ikili değişmezleri nasıl ifade edersiniz?


351

Bir tamsayıyı Python değişmez değerleri ile ikili sayı olarak nasıl ifade edersiniz?

Kolayca hex cevabını bulabildim:

>>> 0x12AF
4783
>>> 0x100
256

ve sekizli:

>>> 01267
695
>>> 0100
64

Python'da ikili ifade etmek için değişmez değerleri nasıl kullanırsınız?


Cevapların Özeti

  • Python 2.5 ve öncesi: İkili kullanarak ifade edebilir, int('01010101111',2)ancak değişmez olarak ifade edemez .
  • Python 2.5 ve öncesi: İkili değişmezleri ifade etmenin bir yolu yoktur .
  • Python 2.6 beta: Bunu şu şekilde yapabilirsiniz: 0b1100111veya 0B1100111.
  • Python 2.6 beta: 0o27veya 0O27(ikinci karakter O harfidir) bir sekizli temsil etmesine izin verecektir .
  • Python 3.0 beta: 2.6 ile aynı, ancak artık 027sekizlik için eski sözdizimine izin vermeyecek.

Yanıtlar:


291

Referans için - gelecekteki Python olasılıkları:
Python 2.6 ile başlayarak 0b veya 0B önekini kullanarak ikili değişmezleri ifade edebilirsiniz :

>>> 0b101111
47

Bir sayının ikili temsilini almak için yeni bin işlevini de kullanabilirsiniz :

>>> bin(173)
'0b10101101'

Belgelerin geliştirme sürümü: Python 2.6'daki Yenilikler


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

Diğer yol.


2
Bu, dizeleriniz olduğunda ilginçtir, ancak saf sayılarla çalışıyorsanız, koda gereksiz hesaplamalar eklersiniz.
Daniel Möller

28

Python'daki ikili değişmezleri nasıl ifade edersiniz?

Bunlar "ikili" değişmez değerler değil, "tamsayı değişmez değerler" dir. Tam sayı değişmezlerini ikili biçimle ve 0ardından a Bveya bardından bir dizi sıfır ve bir ile ifade edebilirsiniz , örneğin:

>>> 0b0010101010
170
>>> 0B010101
21

Python 3 belgelerinden Python'da tamsayı değişmez değerleri sağlamanın yolları şunlardır:

Tam sayı değişmezleri aşağıdaki sözlük tanımlarıyla açıklanır:

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"

Tamsayı değişmez değerleri için kullanılabilir bellekte saklanabileceklerin dışında bir sınır yoktur.

Sıfır olmayan bir ondalık sayıdaki baştaki sıfırlara izin verilmediğine dikkat edin. Bu, Python'un 3.0 sürümünden önce kullandığı C stili sekizli değişmezlerle netleştirme içindir.

Tam sayı değişmezlerine bazı örnekler:

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

3.6 sürümünde değiştirildi: Alt çizgilere artık değişmez değerlerde gruplandırma için izin verilmektedir.

İkili ifade etmenin diğer yolları:

Sıfırlanabilir ve bir dize nesnesine yönlendirilebilir (çoğu durumda tamsayı üzerinde bitsel işlemler yapmanız gerekir) - sıfırlar ve birler dizisinden ve dönüştürdüğünüz tabandan int iletmeniz yeterlidir (2 ):

>>> int('010101', 2)
21

İsteğe bağlı olarak 0bveya 0Bön ekine sahip olabilirsiniz :

>>> int('0b0010101010', 2)
170

Eğer başarılı olursa 0üs olarak dize bir önek ile girmezse, o tabanı 10 üstlenecek:

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

İnt'den insan tarafından okunabilir ikili dosyaya dönüştürme:

İkili bir değişmezin dize olarak temsilini görmek için bin'e bir tamsayı iletebilirsiniz:

>>> bin(21)
'0b10101'

Ve birleştirebilir binve intileri geri dönmek için:

>>> bin(int('010101', 2))
'0b10101'

Önceki sıfırlarla minimum genişliğe sahip olmak istiyorsanız, bir biçim belirtimi de kullanabilirsiniz:

>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'

2

Buradaki başlangıçtaki 0, tabanın 8 olduğunu (10 değil) belirtir; bu, görülmesi oldukça kolaydır:

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

0 ile başlamazsanız, python sayının temel 10 olduğunu varsayar.

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

-1

Python'a söyleyebildiğim kadarıyla, 2.5'e kadar, sadece onaltılık ve sekizli değişmezleri destekler. Gelecekteki sürümlere ikili ekleme hakkında bazı tartışmalar buldum ama kesin bir şey bulamadım.


-3

Ben bu hex () ve oct () ile gitmek belki bin () ile Python 3.0 değişiklik nedeniyle bir şey olduğundan eminim.

EDIT: lbrandy'nin cevabı her durumda doğrudur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.