wake-up-neo.net

bitweise nicht Operator 

Warum bitweise die Operation (~0); -1 ausgibt? In binär sollte 0 nicht 1 sein. Warum ?

39
Sawyer

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:

68

Was Sie eigentlich sagen, ist ~ 0x00000000 und das führt zu 0xFFFFFFFF. Für ein (signiertes) int in Java bedeutet das -1.

13
LaZe

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!
9
nickf

~ 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 = –128

0 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = –127

1 1 1 1 1 1 1 1 = –1
0 0 0 0 0 0 0 0 0 = 0

1 1 1 1 1 1 1 0 = –2
0 0 0 0 0 0 0 1 = 1 

1 0 0 0 0 0 0 1 = –127
0 1 1 1 1 1 1 0 = 126 

1 0 0 0 0 0 0 0 = –128
0 1 1 1 1 1 1 1 = 127

7
N 1.1

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.

3
Bombe

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
1
cletus

Es ist eine binäre Inversion und im zweiten Komplement -1 ist es eine binäre Inversion von 0.

0
Daniel Fath

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

0
kpower

Für 32-Bit-Ganzzahl mit Vorzeichen

~00000000000000000000000000000000=11111111111111111111111111111111 (was -1 ist)

0
YOU

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.

0
Nacho