Giava:Cosa significa ~
-
18-09-2019 - |
Domanda
In questo codice sorgente Java ho questa riga:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Cosa significa la tilde ~
Significare?
Soluzione
La Tilde (~
) esegue un complemento bit per bit di un valore numerico in Java.
Si veda: complemento bit a bit (~
): inverte uno e zero in un numero
Altri suggerimenti
E 'il unario ~ complemento bit a bit operatore (citando) :
- utilizzato solo con valori interi
- inverte i bit cioè un bit 0 diventa 1 bit e viceversa
- in tutti i casi ~ x uguale (-x) -1
questa pagina su operatori bit a bit su wikipedia , in cui si afferma:
Il NOT bit a bit, o complemento, è un operazione unaria che esegue logico negazione su ogni bit, formando la complemento di un dato binario quelli valore. Cifre che erano 0 diventano 1, e viceversa.
Ad esempio:
NOT 0111 (decimal 7)
= 1000 (decimal 8)
In molti linguaggi di programmazione (compresi quelli della famiglia C) , il NOT bit a bit operatore è "
~
" (Tilde).
Dal sito Web di Java http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
L'operatore di complemento bit a bit unario "~" inverte uno schema di bit;Può essere applicato a uno qualsiasi dei tipi integrali, rendendo ogni "0" a "1" e ogni "1" a "0".Ad esempio, un byte contiene 8 bit;Applicare questo operatore a un valore il cui modello di bit è "00000000" cambierebbe il suo modello in "11111111".
Ora, come ha risposto in precedenza Pascal MARTIN, in ogni caso il valore è uguale a -(x)-1.Per esempio.~2=-3, ~-6=5, ecc.
Inoltre, in Java all interi positivi sono memorizzati come rappresentazioni binarie e interi negativi sono memorizzati nel valore del complimento di 2 di un numero intero positivo.
Ora vediamo come funziona a livello di bit nel caso di ~2=-3:
Inizialmente, 2 è memorizzato nella sua rappresentazione binaria:
0000 0000 0000 0010
Ora ~2 risulterà nel valore (invertire i bit):
1111 1111 1111 1101
Come diavolo faccio a sapere che è -3?Bene, è -3 perché deriva dalla rappresentazione di 3 in complemento di 2.
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 obiettivo è trovare x:
1's(x)= 2's(x) - 1 (basato sull'espressione precedente)
Dato che la nostra risposta è nel complimento di 2,
1(x)= 1111 1111 1111 1101 - 0000 0000 0000 0001
1 (x)= 1111 1111 1111 1100
(Come sottrarre -http://sandbox.mc.edu/~bennet/cs110/pm/sub.html)
Pertanto x = complemento di valore di 1 (poiché la risposta che abbiamo ottenuto rappresenta il complemento di valore di 1).
x = 0000 0000 0000 0011
Quindi, abbiamo scoperto che x è 3 e quindi il nostro precedente risultato dell'operatore ~ 1111 1111 1111 1101
è -3 scritto come complemento di 2 di 3.
Come detto prima ~
è il bit a bit unario operatore NOT.
Il vostro esempio verifica se modifiers
contiene bit diversi da quelli definiti in KeyEvent.SHIFT_MASK
.
-
~KeyEvent.SHIFT_MASK
-> tutti i bit ad eccezione di quelli in KeyEvent.SHIFT_MASK sono impostati a 1. -
(modifiers & ~KeyEvent.SHIFT_MASK)
-> ogni 1-bit inmodifiers
che "non appartiene" aKeyEvent.SHIFT_MASK
-
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0)
-> se ci fosse almeno un altro po 'impostato a 1 oltreKeyEvent.SHIFT_MASK
fare qualcosa ...
Dalla documentazione ufficiale http: //java.sun .com / docs / libri / tutorial / java / nutsandbolts / op3.html :
Il unario operatore di complemento bit a bit "~" inverte uno schema di bit; può essere applicato su qualsiasi tipo 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 relativo modello a "11111111".