bitweiser Nicht-Operator

Lesezeit: 2 Minuten

Benutzeravatar von Sawyer
Säger

Warum bitweise Operation (~0); druckt -1 ? Im Binärformat sollte nicht 0 1 sein. warum ?

  • Wenn Sie ein einzelnes Bit umdrehen möchten, verwenden Sie x ^ 1.

    – kennytm

    25. März 2010 um 7:10 Uhr

  • Es ist kein ‘nicht’-Operator. Es ist ein ‘Komplement’-Operator.

    – Benutzer207421

    25. März 2010 um 9:07 Uhr

  • @EJP: A Einsen Komplementoperator.

    – kennytm

    25. März 2010 um 15:48 Uhr

  • Nein ist es nicht. Die Sprachspezifikation #4.2.2 definiert „~“ als „den bitweisen Komplementoperator“. In Java gibt es keinen ‘Bit-Operator für NOT’.

    – Benutzer207421

    26. März 2010 um 1:16 Uhr

  • @lh3: Nein. Es ist sowohl in C als auch in C++ ein Einerkomplementoperator.

    – kennytm

    26. März 2010 um 16:41 Uhr

Benutzeravatar von polygenelubricants
polygenelubricants

Du bist eigentlich ganz in der Nähe.

In binär sollte nicht 0 1 sein

Ja, das ist absolut richtig, wenn wir von einem Bit sprechen.

ABER, ein int dessen Wert 0 ist, sind eigentlich 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 unsigned int in Zweierkomplementdarstellung, ~1 == -2.


Weiterlesen:

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

Sie können sich vorstellen, dass das erste Bit in einer vorzeichenbehafteten Zahl -(2 istx-1), wobei x die Anzahl der Bits ist.

Bei einer gegebenen 8-Bit-Zahl ist der Wert jedes Bits (in der Reihenfolge von links nach rechts):

-128 64 32 16 8 4 2 1

Nun, in Binärform ist 0 offensichtlich nur 0:

    -128 64 32 16 8 4 2 1
0      0  0  0  0 0 0 0 0 = 0

Und wenn du das bitweise machst nicht ~ jede dieser Nullen wird 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 den Ü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!

Benutzeravatar von N 1.1
N 1.1

~ 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 Zweierkomplementform und ihre 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

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

Da ~ ist keine binäre Inversion, sondern eine bitweise Inversion. Binäre Umkehrung wäre ! und kann (in Java) nur auf boolesche Werte angewendet werden.

Benutzeravatar von GManNickG
GManNickG

In der Standard-Binärcodierung ist 0 alles Nullen, ~ ist bitweise NICHT. Alle 1s sind (meistens) -1 für vorzeichenbehaftete Integer-Typen. Also für einen signierten Byte-Typ:

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

Benutzeravatar von Daniel Fath
Daniel Fath

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

1408120cookie-checkbitweiser Nicht-Operator

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy