In diesem Java-Quellcode habe ich diese Zeile:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Was bedeutet die Tilde ~
?
In diesem Java-Quellcode habe ich diese Zeile:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Was bedeutet die Tilde ~
?
Antworten:
Tilde ( ~
) führt eine bitweise Ergänzung eines numerischen Werts in Java durch.
Siehe: Bitweises Komplement ( ~
): Invertiert Einsen und Nullen in einer Zahl
Es ist die Unary ~ bitweise Komplement Operator (Zitat) :
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).
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.
Wie bereits erwähnt, ~
ist der unäre bitweise NICHT-Operator.
In Ihrem Beispiel wird geprüft, ob modifiers
andere 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 modifiers
dem "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_MASK
etwas zu tun ...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.