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 ~1
jest:
11111110
Który jest -2
w 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, True
i 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 bool
przedefiniowuje str
i repr
wyś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, 1
ale nie jest tak, ponieważ jest to podklasa @ Martijn dodała tę informację w swojej odpowiedzi. ~'1'
~True
bool
int
True == -1
, i znam wielu, gdzie można by powiedzieć True == 1
...
-1
TRUE; ma fajną właściwość, że bitowe operatory AND i OR działają również dla logicznego AND i OR ( x & -1
jest różna od zera w tych samych przypadkach, która x && 1
jest 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 -1
TRUE.
truth
jako bezwartościowa; ze wszystkim, czego nie true
ma false
. Wszystkie języki programowania, które znam, false
stawiają 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 bool
jest podklasą int
(ze względów historycznych; wartości logiczne zostały dodane tylko w Pythonie 2.3).
Skoro int(True)
jest 1
, ~True
to ~1
jest -2
.
Zobacz PEP 285, aby dowiedzieć się, dlaczego bool
jest to podklasa int
.
Jeśli chcesz mieć odwrotność logiczną, użyj not
:
>>> not True
False
>>> not False
True
Jeśli chcesz wiedzieć, dlaczego tak ~1
jest -2
, to dlatego, że odwracasz wszystkie bity w liczbie całkowitej ze znakiem; 00000001
staje 1111110
któ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 1
bit oznacza, że wartość jest ujemna, a pozostałe bity kodują odwrotność liczby dodatniej minus jeden.
struct.pack
as 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 -2
reprezentacja jest 10
to dlaczego -
znak.
10
2'complement to -ve?
format(-2 % (1 << 32), "032b")
format(-2 & ((1 << 32) - 1), "032b")
~True == -2
nie 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”
~1
jest-2
, spróbuj:True == 1