Java: Was bedeutet ~

75

In diesem Java-Quellcode habe ich diese Zeile:

if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....

Was bedeutet die Tilde ~?

Martijn Courteaux
quelle

Antworten:

53

Es ist die Unary ~ bitweise Komplement Operator (Zitat) :

  • Wird nur mit ganzzahligen Werten verwendet
  • invertiert die Bits, dh ein 0-Bit wird zu 1-Bit und umgekehrt
  • in allen Fällen ist ~ x gleich (-x) -1

Siehe auch diese Seite über Bitwise-Operatoren auf Wikipedia , auf der es heißt:

Das bitweise NICHT oder Komplement ist eine unäre Operation, die für jedes Bit eine logische Negation durchführt und das Einsenkomplement des gegebenen Binärwerts bildet. Ziffern, die 0 waren, werden zu 1 und umgekehrt.
Zum Beispiel:

NOT 0111  (decimal 7)
  = 1000  (decimal 8)

In vielen Programmiersprachen (einschließlich der C-Familie) lautet der bitweise NOT-Operator " ~" (Tilde).

Pascal MARTIN
quelle
14

Von der Java-Website http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

Der unäre bitweise Komplementoperator "~" invertiert ein Bitmuster; Es kann auf jeden der Integraltypen angewendet werden, wobei jede "0" eine "1" und jede "1" eine "0" wird. Zum Beispiel enthält ein Byte 8 Bits; Das Anwenden dieses Operators auf einen Wert, dessen Bitmuster "00000000" ist, würde sein Muster in "11111111" ändern.

Nun, wie zuvor von Pascal MARTIN beantwortet, ist der Wert in jedem Fall gleich - (x) -1. ZB ~ 2 = -3, ~ -6 = 5 usw.

Außerdem werden in Java alle positiven Ganzzahlen als ihre binären Darstellungen und negative Ganzzahlen im 2er-Komplementwert einer positiven Ganzzahl gespeichert.

Nun wollen wir sehen, wie es auf Bit-Ebene im Fall von ~ 2 = -3 funktioniert:

Zunächst wird 2 in seiner binären Darstellung gespeichert:

0000 0000 0000 0010

Jetzt ergibt ~ 2 den Wert (inverse die Bits):

1111 1111 1111 1101

Woher in aller Welt weiß ich, dass es -3 ist? Nun, es ist -3, weil es aus der Komplimentdarstellung von 3 von 2 abgeleitet ist.

Wie wir wissen, 2 (x) = 1 (x) + 1 ( https://delightlylinux.wordpress.com/2014/10/13/binary-lesson-12-ones-complement-and-twos-complement/ )
Unser Ziel ist es, x zu finden :
1 (x) = 2 (x) - 1 (basierend auf dem vorherigen Ausdruck)

Da unsere Antwort in 2 ist, ist
1 (x) = 1111 1111 1111 1101 - 0000 0000 0000 0001
1 (x) = 1111 1111 1111 1100(Subtrahieren - http://sandbox.mc.edu/~bennet/cs110/pm/sub.html )

Daher x = 1 Kompliment an den Wert (da die Antwort, die wir erhalten haben, das Kompliment von 1 für x darstellt).
x = 0000 0000 0000 0011
Wir haben also festgestellt, dass x 3 ist und daher ist unser vorheriges Ergebnis des Operators ~ 1111 1111 1111 1101-3 als 2-Kompliment von 3 geschrieben.

Dhwaneel
quelle
9

Wie bereits erwähnt, ~ist der unäre bitweise NICHT-Operator.
In Ihrem Beispiel wird geprüft, ob modifiersandere als die in definierten Bits enthalten sind KeyEvent.SHIFT_MASK.

  • ~KeyEvent.SHIFT_MASK -> Alle Bits außer denen in KeyEvent.SHIFT_MASK werden auf 1 gesetzt.
  • (modifiers & ~KeyEvent.SHIFT_MASK)-> jedes 1-Bit in modifiersdem "nicht gehört"KeyEvent.SHIFT_MASK
  • if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0)-> wenn mindestens ein anderes Bit auf 1 gesetzt war, außer KeyEvent.SHIFT_MASKetwas zu tun ...
VolkerK
quelle
3

Aus den offiziellen Dokumenten http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html :

Der unäre bitweise Komplementoperator "~" invertiert ein Bitmuster; Es kann auf jeden der Integraltypen angewendet werden, wobei jede "0" eine "1" und jede "1" eine "0" wird. Zum Beispiel enthält ein Byte 8 Bits; Das Anwenden dieses Operators auf einen Wert, dessen Bitmuster "00000000" ist, würde sein Muster in "11111111" ändern.

Alberto Zaccagni
quelle