~ True neden -2 ile sonuçlanır?


132

Python konsolunda:

~True

Bana verir:

-2

Neden? Birisi bana bu özel durumu ikili olarak açıklayabilir mi?


22
Çünkü ~1ise -2, deneyin:True == 1
— Grijesh Chauhan

15
Kesin olmak gerekirse: " True is 1" bu doğru değil , ama bu doğrudur True == 1.
— Bach

3
Gerçekten görmenin UNARY_INVERT(bayt kodunun tamamı) yanıtlara bir şey katacağını düşünüyor musunuz ?
— Wooble

2
Bu soru yinelenen soru değil ! Belirli bir davranışı sorar bool. Nasıl ~çalıştığıyla ilgili değil . Aslında bu soruya verilecek geçerli bir cevap, 2'nin tamamlayıcısından ve ~tamsayılar üzerinde nasıl çalıştığından bahsetmekten kaçınabilir .
— Bakuriu

Yanıtlar:


240

int(True)olduğunu 1.

1 dır-dir:

00000001

ve ~1şudur:

11111110

Hangi -2içinde İki'nin tamamlayıcı 1

1 Tüm bitleri çevirin, elde edilen sayıya 1 ekleyin ve sonucu , büyüklüğün ikili temsili olarak yorumlayın ve bir negatif işaret ekleyin (sayı 1 ile başladığından beri):

11111110 → 00000001 → 00000010 
         ↑          ↑ 
       Flip       Add 1

Bu 2'dir, ancak MSB 1 olduğu için işaret negatiftir .


Bahsetmeye değer:

Düşünün bool, bunu doğada sayısal olduğunu göreceksiniz - Bu iki değeri vardır, Trueve False, ve onlar sadece sadece kendilerini farklı yazdırmak tamsayılar 1 ve 0 sürümlerini "özelleştirilmiş" vardır. Tam sayı türünün alt sınıflarıdırint .

Dolayısıyla, onları farklı şekilde boolyeniden tanımlaması strve reprgöstermesi dışında tam olarak 1 ve 0 gibi davranırlar .

>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True

>>> True == 1
True
>>> True is 1  # they're still different objects
False

1
Her ne kadar: @ofcapl Hemen demek istedim int('1')de 1ama ~'1'oysa bir TypeError istisnası olması ~Truenedeniyle bu değil boolbir alt sınıfıdır intMartijn onun cevabını bu bilgiyi katma @.
— Grijesh Chauhan

Kayıt için, @ofcapl, bu cevap, gerçek bayt kodunu (kaynaktan derlenen bir tür orta düzey veya işlem seviyesi kodu olabilir) değil, olup bitenlerin ikili aritmetik yorumunu gösterir .
— Patrick M

5
@etrusco hangi dillerden bahsediyorsun? Tam olarak 0 nerede True == -1olduğunu biliyorum ve bunu söylenebilecek pek çok True == 1
— kişiyi

1
@etrusco @ l4mpi Bazı eski tarz BASIC'ler -1TRUE için kullanır ; kısa devre umursamadığınız sürece bitsel AND ve OR operatörlerinin mantıksal AND ve OR için de çalıştığı güzel özelliğe sahiptir ( C'de sıfır olmayan x & -1aynı durumlarda x && 1sıfırdan farklıdır) . Ancak, bildiğim kadarıyla hiçbir ana dil -1TRUE için kullanılmadı .
— Quuxplusone

1
Biçimsel mantık tek truthdeğerli olarak tanımlar ; tüm olmadığını trueolmanın false. Bildiğim tüm programlama dilleri, falsedeğersiz (0) ve yanlış olmayan her şey olarak tanımlayarak biçimsel mantığı tersine çevirir true. Örneğin C # , her ne kadar Javascript aykırı bir şey olsa da, birden çok doğruluk çeşidine ve çok sayıda sahtekarlığa sahip .
— Nicholas Carey

45

Python booltürü bir alt sınıfıdır int(tarihsel nedenlerden dolayı; boole'lar yalnızca Python 2.3'e eklenmiştir).

Yana int(True)olduğunu 1, ~Truebir ~1olduğunu -2.

Neden bir alt sınıfı olduğunu görmek için PEP 285'e bakın .boolint

Boolean tersini istiyorsanız, şunu kullanın not:

>>> not True
False
>>> not False
True

Neden ~1olduğunu bilmek istiyorsanız -2, bunun nedeni işaretli bir tam sayıdaki tüm bitleri ters çevirmenizdir; 00000001olur 1111110bir de hangi imzalı tamsayı negatif bir sayıdır, bkz İki'nin tamamlayıcı :

>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'

burada ilk 1bit, değerin negatif olduğu anlamına gelir ve bitlerin geri kalanı, pozitif sayı eksi birin tersini kodlar.


1
@GrijeshChauhan: ikinin iltifat için şunu kullanabilirsiniz struct.packolarak, bin(integer)ya da format(integer, '08b')hesaba imzalı tamsayı yapmayız.
— Martijn Pieters

@thefourtheye, MartijnPieters Denedim Ama mesela kafa karıştırıcı bin(~True), bin(-2), bin(~1)tüm verir '-0b10' ise -2temsilidir 10sonra neden -işaret.
— Grijesh Chauhan

Demek 10ardından -ve 2'complement kendisi?
— Grijesh Chauhan

1
@GrijeshChauhan İkisinin hem negatif hem de pozitif sayıların tümleme notasyonunu bunun gibi alabilirsinizformat(-2 % (1 << 32), "032b")
— thefourtheye

2
@thefourtheye: Bir bit maskesi kullanırım:format(-2 & ((1 << 32) - 1), "032b")
— Martijn Pieters

4

~True == -2olup olmadığını şaşırtıcı değil True araç 1 ve ~ araç bit düzeyinde inversiyon ...

... şartıyla

  • True bir tamsayı olarak kabul edilebilir ve
  • tamsayılar İkinin tümleyeninde temsil edilir

Düzenlemeler:

  • tamsayı gösterimi ve bitsel ters çevirme operatörü arasındaki karıştırma düzeltildi
  • başka bir parlatma uyguladı (mesaj ne kadar kısa olursa, o kadar çok iş gerekir)

2
~"2s tamamlayıcı" anlamına gelmez. ~"Bitsel Ters Çevirme" anlamına gelir
— McKay

1
"Birlerin tamamlayıcısı" ifadesi, tam sayıları bitler halinde depolayan bir sisteme atıfta bulunduğu kadar, gerçekten bir işleme atıfta bulunmaz. Aslında bir bilgisayar sisteminde kullanılmayan bir sistem.
— McKay
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.