W konsoli Pythona:
~True
Daje mi:
-2
Czemu? Czy ktoś może mi wyjaśnić ten konkretny przypadek w systemie binarnym?
python
data-conversion
tilde
lukaszkups
źródło
źródło
~1
jest-2
, spróbuj:True == 1
True is 1
", ale to prawdaTrue == 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)
jest1
.1
jest:00000001
i
~1
jest:11111110
Który jest
-2
w uzupełnieniu do dwóch 11 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
iFalse
, i są one po prostu „dostosowane” wersje liczb całkowitych 1 i 0, że tylko drukują się inaczej. Są to podklasy typu całkowitegoint
.Zachowują się więc dokładnie jak 1 i 0, z tą różnicą, że
bool
przedefiniowujestr
irepr
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
źródło
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órax && 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 nietrue
mafalse
. 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 bytemtrue
). 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)
jest1
,~True
to~1
jest-2
.Zobacz PEP 285, aby dowiedzieć się, dlaczego
bool
jest to podklasaint
.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
staje1111110
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.źródło
struct.pack
asbin(integer)
lubformat(integer, '08b')
nie brać pod uwagę liczb całkowitych ze znakiem .bin(~True)
,bin(-2)
,bin(~1)
wszystko daje'-0b10'
Jeśli-2
reprezentacja jest10
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
oznacza1
i~
oznacza inwersję bitową ...... pod warunkiem, że
True
można traktować jako liczbę całkowitą iEdycje:
źródło
~
nie oznacza „uzupełnienia do dwóch”.~
oznacza „Bitwise Inversion”