~ 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.