Domanda

In questo codice sorgente Java ho questa riga:

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

Cosa significa la tilde ~ Significare?

È stato utile?

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 in modifiers che "non appartiene" a KeyEvent.SHIFT_MASK
  • if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) -> se ci fosse almeno un altro po 'impostato a 1 oltre KeyEvent.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".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top