web-dev-qa-db-fra.com

Java: Que signifie ~

Dans ce Java code source j'ai cette ligne:

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

Qu'est-ce que le tilde ~ signifier?

70
Martijn Courteaux

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

65
Richard

Il s'agit de l'opérateur complément unaire ~ au niveau du bit (citation) :

  • utilisé uniquement avec des valeurs entières
  • inverse les bits, c'est-à-dire qu'un 0-bit devient 1-bit et vice versa
  • dans tous les cas ~ x est égal à (-x) -1

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

50
Pascal MARTIN

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 1101est -3 écrit comme compliment de 2 à 3.

10
Dhwaneel

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 ...
8
VolkerK

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

3
Alberto Zaccagni