Dans ce Java code source j'ai cette ligne:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Qu'est-ce que le tilde ~
signifier?
Le Tilde (~
) effectue un complément au niveau du bit d'une valeur numérique en Java.
Voir: Complément au niveau du bit (~
): inverse les uns et les zéros dans un nombre
Il s'agit de l'opérateur complément unaire ~ au niveau du bit (citation) :
Voir aussi cette page sur les opérateurs Bitwise sur wikipedia , qui dit:
Le NOT ou complément au niveau du bit est une opération unaire qui effectue une négation logique sur chaque bit, formant le complément à ceux de la valeur binaire donnée. Les chiffres qui étaient 0 deviennent 1 et vice versa.
Par exemple:
NOT 0111 (decimal 7)
= 1000 (decimal 8)
Dans de nombreux langages de programmation (y compris ceux de la famille C) , l'opérateur NOT au niveau du bit est "
~
"(tilde).
Depuis le site Web de Java http: //docs.Oracle.com/javase/tutorial/Java/nutsandbolts/op3.html
L'opérateur unaire de complément binaire "~" inverse un motif binaire; il peut être appliqué à n'importe quel type intégral, faisant de chaque "0" un "1" et de chaque "1" un "0". Par exemple, un octet contient 8 bits; appliquer cet opérateur à une valeur dont le motif binaire est "00000000" changerait son motif en "11111111".
Maintenant, comme précédemment répondu par Pascal MARTIN, dans un cas donné, la valeur est égale à - (x) -1. Par exemple. ~ 2 = -3, ~ -6 = 5, etc.
De plus, dans Java tous les entiers positifs sont stockés comme leurs représentations binaires et les entiers négatifs sont stockés dans la valeur de compliment 2 d'un entier positif.
Voyons maintenant comment cela fonctionne au niveau du bit en cas de ~ 2 = -3:
Initialement, 2 est stocké dans sa représentation binaire:
0000 0000 0000 0010
Maintenant ~ 2 donnera la valeur (inverse les bits):
1111 1111 1111 1101
Comment diable je sais que c'est -3? Eh bien, c'est -3 car il est dérivé de la représentation du compliment de 2 de 3.
Comme nous le savons 2 (x) = 1 (x) + 1 ( https: //delightlylinux.wordpress.com/2014/10/13/binary-lesson-12-ones-complement-and-twos-complement / )
Notre objectif est de trouver x :
1 (x) = 2 (x) - 1 (basé sur l'expression précédente)
Comme notre réponse est dans le compliment de 2,
1 (x) = 1111 1111 1111 1101 - 0000 0000 0000 0001
1 (x) = 1111 1111 1111 1100
(Comment soustraire - http: //sandbox.mc.edu/~bennet/cs110/pm/sub.html )
Par conséquent, le compliment de valeur de x = 1 (comme la réponse que nous avons obtenue représente le compliment de 1 de x).
x = 0000 0000 0000 0011
Donc, nous avons trouvé que x est 3 et donc notre résultat précédent de l'opérateur ~ 1111 1111 1111 1101
est -3 écrit comme compliment de 2 à 3.
Comme dit précédemment, ~
Est l'opérateur NOT unaire au niveau du bit.
Votre exemple teste si modifiers
contient des bits autres que ceux définis dans KeyEvent.SHIFT_MASK
.
~KeyEvent.SHIFT_MASK
-> tous les bits sauf ceux de KeyEvent.SHIFT_MASK sont définis sur 1.(modifiers & ~KeyEvent.SHIFT_MASK)
-> chaque 1 bit dans modifiers
qui "n'appartient pas" à KeyEvent.SHIFT_MASK
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0)
-> s'il y avait au moins un autre bit mis à 1 en plus de KeyEvent.SHIFT_MASK
faites quelque chose ...Depuis les documents officiels http://Java.Sun.com/docs/books/tutorial/Java/nutsandbolts/op3.html :
L'opérateur unaire de complément au niveau du bit "~" inverse une configuration binaire; il peut être appliqué à n'importe quel type intégral, faisant de chaque "0" un "1" et de chaque "1" un "0". Par exemple, un octet contient 8 bits; appliquer cet opérateur à une valeur dont le motif binaire est "00000000" changerait son motif en "11111111".