Warum bitweise die Operation (~0);
-1 ausgibt? In binär sollte 0 nicht 1 sein. Warum ?
Du bist eigentlich ganz nah dran.
In binär sollte 0 nicht 1 sein
Ja, das ist absolut richtig, wenn wir über ein bisschen sprechen.
Allerdings ist ein int
, dessen Wert 0 ist, tatsächlich 32 Bits aller Nullen! ~
invertiert alle 32 Nullen in 32 Einsen.
System.out.println(Integer.toBinaryString(~0));
// prints "11111111111111111111111111111111"
Dies ist die Zweierkomplementdarstellung von -1
.
Ähnlich:
System.out.println(Integer.toBinaryString(~1));
// prints "11111111111111111111111111111110"
Das heißt, für ein 32-Bit-unsigniertes int
in der Zweierkomplementdarstellung ~1 == -2
.
Lesen Sie weiter:
~
~x
in allen Fällen gleich (-x)-1
ist"Was Sie eigentlich sagen, ist ~ 0x00000000 und das führt zu 0xFFFFFFFF. Für ein (signiertes) int in Java bedeutet das -1.
Sie können sich das erste Bit einer signierten Zahl als - (2x -1) wobei x die Anzahl der Bits ist.
Bei einer 8-Bit-Nummer lautet der Wert jedes Bits (in der Reihenfolge von links nach rechts):
-128 64 32 16 8 4 2 1
In binär ist 0 natürlich alle 0:
-128 64 32 16 8 4 2 1
0 0 0 0 0 0 0 0 0 = 0
Und wenn Sie den bitweisen nicht ~
ausführen, wird jede dieser 0s zu einer 1:
-128 64 32 16 8 4 2 1
~0 1 1 1 1 1 1 1 1
= -128+64+32+16+8+4+2+1 == -1
Dies ist auch hilfreich, um Überlauf zu verstehen:
-128 64 32 16 8 4 2 1
126 0 1 1 1 1 1 1 0 = 126
+1 0 1 1 1 1 1 1 1 = 127
+1 1 0 0 0 0 0 0 0 = -128 overflow!
~
ist ein bitweiser Operator.
~0 = 1 which is -1 in 2's complement form
http://en.wikipedia.org/wiki/Two's_complement
Einige Zahlen in Zweierkomplement-Form und deren bitweise nicht ~
(direkt darunter):
0 1 1 1 1 1 1 1 = 127
1 0 0 0 0 0 0 0 = –1280 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = –1271 1 1 1 1 1 1 1 = –1
0 0 0 0 0 0 0 0 0 = 01 1 1 1 1 1 1 0 = –2
0 0 0 0 0 0 0 1 = 11 0 0 0 0 0 0 1 = –127
0 1 1 1 1 1 1 0 = 1261 0 0 0 0 0 0 0 = –128
0 1 1 1 1 1 1 1 = 127
Da ~
keine binäre Inversion ist, ist es eine bitweise Inversion. Die binäre Inversion wäre !
und kann (in Java) nur auf boolesche Werte angewendet werden.
Bei der binären Standardcodierung ist 0 alles 0, ~
ist bitweise NICHT. Alle 1s ist (am häufigsten) -1 für vorzeichenbehaftete Integer-Typen. Also für einen signierten Bytetyp:
0xFF = -1 // 1111 1111
0xFE = -2 // 1111 1110
...
0xF0 = -128 // 1000 0000
0x7F = 127 // 0111 1111
0x7E = 126 // 0111 1110
...
0x01 = 1 // 0000 0001
0x00 = 0 // 0000 0000
Es ist eine binäre Inversion und im zweiten Komplement -1 ist es eine binäre Inversion von 0.
0 ist hier kein bisschen. Es ist ein Byte (mindestens; oder mehr) - 00000000. Bei Verwendung von bitweise wird 11111111 verwendet. Es ist -1 als vorzeichenbehaftete Ganzzahl ...
Für 32-Bit-Ganzzahl mit Vorzeichen
~00000000000000000000000000000000=11111111111111111111111111111111
(was -1 ist)
Ich denke, der wahre Grund ist, dass ~ die Zwei-Komplement ist.
Javascript bezeichnet die Zeichen-Tilde ~ für das Zwei-Komplement, auch wenn Tilde in den meisten Programmiersprachen ein wenig für das eine Komplement ist.