W konsoli Pythona:
~True
Daje mi:
-2
Czemu? Czy ktoś może mi wyjaśnić ten konkretny przypadek w systemie binarnym?
W konsoli Pythona:
~True
Daje mi:
-2
Czemu? Czy ktoś może mi wyjaśnić ten konkretny przypadek w systemie binarnym?
True is 1", ale to prawda True == 1.
UNARY_INVERT(całego kodu bajtowego) doda cokolwiek do odpowiedzi?
bool. Nie chodzi o to, jak ~działa. W rzeczywistości poprawna odpowiedź na to pytanie mogłaby w ogóle uniknąć wspominania o dopełnieniu do 2 i tym, jak ~w ogóle działa na liczbach całkowitych.
Odpowiedzi:
int(True)jest 1.
1 jest:
00000001
i ~1jest:
11111110
Który jest -2w uzupełnieniu do dwóch 1
1 Odwróć wszystkie bity, dodaj 1 do uzyskanej liczby i zinterpretuj wynik jako binarną reprezentację wielkości i dodaj znak ujemny (ponieważ liczba zaczyna się od 1):
11111110 → 00000001 → 00000010
↑ ↑
Flip Add 1
To jest 2, ale znak jest ujemny, ponieważ MSB wynosi 1.
Warte wspomnienia:
Pomyśl o tym bool, przekonasz się, że jest to numeryczny w przyrodzie - ma dwie wartości, Truei False, i są one po prostu „dostosowane” wersje liczb całkowitych 1 i 0, że tylko drukują się inaczej. Są to podklasy typu całkowitego int.
Zachowują się więc dokładnie jak 1 i 0, z tą różnicą, że boolprzedefiniowuje stri reprwyświetla je w inny sposób.
>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True
>>> True == 1
True
>>> True is 1 # they're still different objects
False
int('1')jest to również wyjątek błędu typu, 1ale nie jest tak, ponieważ jest to podklasa @ Martijn dodała tę informację w swojej odpowiedzi. ~'1'~Trueboolint
True == -1, i znam wielu, gdzie można by powiedzieć True == 1...
-1TRUE; ma fajną właściwość, że bitowe operatory AND i OR działają również dla logicznego AND i OR ( x & -1jest różna od zera w tych samych przypadkach, która x && 1jest różna od zera w C), o ile nie obchodzi cię zwarcie . Jednak z tego co wiem, żaden mainstreamowy język nigdy nie używał określenia -1TRUE.
truthjako bezwartościowa; ze wszystkim, czego nie truema false. Wszystkie języki programowania, które znam, falsestawiają na głowie logikę formalną, definiując ją jako bezwartościową (0) i wszystko, co nie jest fałszywym bytem true). Na przykład C # , chociaż Javascript jest czymś odstającym, mając wiele smaków prawdziwości i wiele smaków fałszu .
Typ Pythona booljest podklasą int(ze względów historycznych; wartości logiczne zostały dodane tylko w Pythonie 2.3).
Skoro int(True)jest 1, ~Trueto ~1jest -2.
Zobacz PEP 285, aby dowiedzieć się, dlaczego booljest to podklasa int.
Jeśli chcesz mieć odwrotność logiczną, użyj not:
>>> not True
False
>>> not False
True
Jeśli chcesz wiedzieć, dlaczego tak ~1jest -2, to dlatego, że odwracasz wszystkie bity w liczbie całkowitej ze znakiem; 00000001staje 1111110które w podpisana liczba całkowita jest liczbą ujemną, patrz uzupełnienie dwóch za :
>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
gdzie początkowy 1bit oznacza, że wartość jest ujemna, a pozostałe bity kodują odwrotność liczby dodatniej minus jeden.
struct.packas bin(integer)lub format(integer, '08b')nie brać pod uwagę liczb całkowitych ze znakiem .
bin(~True), bin(-2), bin(~1)wszystko daje '-0b10' Jeśli -2reprezentacja jest 10to dlaczego -znak.
102'complement to -ve?
format(-2 % (1 << 32), "032b")
format(-2 & ((1 << 32) - 1), "032b")
~True == -2nie jest zaskakujące, jeśliTrue oznacza 1 i ~ oznacza inwersję bitową ...
... pod warunkiem, że
True można traktować jako liczbę całkowitą iEdycje:
~nie oznacza „uzupełnienia do dwóch”. ~oznacza „Bitwise Inversion”
~1jest-2, spróbuj:True == 1