Java: cosa significa ~

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) :

  • usato solo con valori interi
  • inverte i bit, ovvero un 0 bit diventa 1 bit e viceversa
  • in tutti i casi ~ x è uguale a (-x) -1

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