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.