In questo codice sorgente Java ho questa linea:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Cosa significa la tilde ~
?
La Tilde ( ~
) esegue un complemento bit per bit di un valore numerico in Java.
Vedi: Bitwise complement ( ~
): inverte uno e zero in un numero
È l’operatore del complemento bitario Unary ~ (quoting) :
Vedi anche questa pagina sugli operatori Bitwise su wikipedia , che afferma:
Il NOT bit a bit, o complemento, è un’operazione unaria che esegue la negazione logica su ciascun bit, formando il complemento di quelli del valore binario dato. Le cifre che erano 0 diventano 1 e viceversa.
Per esempio:
NOT 0111 (decimal 7) = 1000 (decimal 8)
In molti linguaggi di programmazione (compresi quelli della famiglia C) , l’operatore NOT bit a bit è ”
~
” (tilde).
Come detto prima ~
è l’operatore NOT bit a bit unario.
Il tuo esempio verifica se i modifiers
contengono bit diversi da quelli definiti in KeyEvent.SHIFT_MASK
.
~KeyEvent.SHIFT_MASK
-> tutti i bit tranne quelli in KeyEvent.SHIFT_MASK sono impostati su 1. (modifiers & ~KeyEvent.SHIFT_MASK)
-> ogni 1 bit nei modifiers
che “non appartiene” a KeyEvent.SHIFT_MASK
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0)
-> se c’era almeno un altro bit impostato su 1 oltre a KeyEvent.SHIFT_MASK
fare qualcosa … Dal sito Web di Java http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
L’operatore di complemento bit per bit unario “~” inverte un pattern di bit; può essere applicato a qualsiasi tipo di integrale, rendendo ogni “0” a “1” e ogni “1” a “0”. Ad esempio, un byte contiene 8 bit; applicando questo operatore ad un valore il cui schema di bit è “00000000” cambierebbe il suo modello in “11111111”.
Ora, come precedentemente risposto da Pascal MARTIN, in ogni caso il vlaue è uguale a – (x) -1. Ad esempio ~ 2 = -3, ~ -6 = 5, ecc.
Inoltre, in java tutti gli interi positivi sono memorizzati come le loro rappresentazioni binarie e gli interi negativi sono memorizzati nel valore di complimento di 2 di un numero intero positivo.
Ora, vediamo come funziona a livello di bit in caso di ~ 2 = -3:
Inizialmente, 2 è memorizzato nella sua rappresentazione binaria:
0000 0000 0000 0010
Ora ~ 2 determinerà il valore (inverso i bit):
1111 1111 1111 1101
Come diavolo so che è -3? Bene, è -3 perché deriva dalla rappresentazione di complimento di 2 di 3.
Come sappiamo 2’s (x) = 1’s (x) + 1 ( https://delightlylinux.wordpress.com/2014/10/13/binary-lesson-12-ones-complement-and-twos-complement/ )
Il nostro scopo è trovare x :
1 (x) = 2 (x) – 1 (in base all’espressione precedente)
Come la nostra risposta è in è nel complimento di 2,
1 (x) = 1111 1111 1111 1101 - 0000 0000 0000 0001
1’s (x) = 1111 1111 1111 1100
(Come sottrarre – http://sandbox.mc.edu/~bennet/cs110/pm/sub.html )
Quindi il complemento di valore di x = 1 (dato che la risposta che abbiamo ottenuto rappresenta il complimento di 1 di x).
x = 0000 0000 0000 0011
Quindi, abbiamo scoperto che x è 3 e quindi il nostro precedente risultato di ~ operatore 1111 1111 1111 1101
è -3 scritto come complimento di 2 di 3.
Dai documenti ufficiali http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html :
L’operatore di complemento bit per bit unario “~” inverte un pattern di bit; può essere applicato a qualsiasi tipo di integrale, rendendo ogni “0” a “1” e ogni “1” a “0”. Ad esempio, un byte contiene 8 bit; applicando questo operatore ad un valore il cui schema di bit è “00000000” cambierebbe il suo modello in “11111111”.