Java: ¿Qué significa ~?

En este código fuente de Java, tengo esta línea:

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

¿Qué significa la tilde ~ ?

The Tilde ( ~ ) realiza un complemento bit a bit de un valor numérico en Java.

Ver: complemento bit a bit ( ~ ): invierte unos y ceros en un número

Es el operador de complemento Unario ~ Bitwise (citando) :

  • solo se usa con valores enteros
  • invierte los bits, es decir, un 0 bit se convierte en 1 bit y viceversa
  • en todos los casos ~ x es igual a (-x) -1

Ver también esta página en operadores de Bitwise en wikipedia , que dice:

El NOT a nivel de bit, o complemento, es una operación unaria que realiza la negación lógica en cada bit, formando el complemento de uno de los valores binarios dados. Los dígitos que eran 0 se convierten en 1, y viceversa.
Por ejemplo:

 NOT 0111 (decimal 7) = 1000 (decimal 8) 

En muchos lenguajes de progtwigción (incluidos los de la familia C) , el operador NOT bit a bit es ” ~ ” (tilde).

Como se dijo anteriormente ~ es el operador NOT bit a bit unario.
Su ejemplo prueba si los modifiers contienen bits distintos a los definidos en KeyEvent.SHIFT_MASK .

  • ~KeyEvent.SHIFT_MASK -> todos los bits excepto los de KeyEvent.SHIFT_MASK están configurados en 1.
  • (modifiers & ~KeyEvent.SHIFT_MASK) -> cada 1 bit en modifiers que “no pertenecen” a KeyEvent.SHIFT_MASK
  • if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) -> si había al menos otro bit configurado en 1 además de KeyEvent.SHIFT_MASK hacer algo …

Desde el sitio web de Java http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

El operador complementario bit a bit “~” invierte un patrón de bits; se puede aplicar a cualquiera de los tipos integrales, haciendo que cada “0” sea “1” y cada “1” sea “0”. Por ejemplo, un byte contiene 8 bits; aplicar este operador a un valor cuyo patrón de bits es “00000000” cambiaría su patrón a “11111111”.

Ahora, como previamente respondió Pascal MARTIN, en cualquier caso dado el vlaue es igual a – (x) -1. Ej. ~ 2 = -3, ~ -6 = 5, etc.

Además, en java, todos los enteros positivos se almacenan como sus representaciones binarias y los enteros negativos se almacenan en el valor complementario de 2 de un entero positivo.

Ahora, veamos cómo funciona en el nivel de bits en caso de ~ 2 = -3:

Inicialmente, 2 se almacena en su representación binaria:

 0000 0000 0000 0010 

Ahora ~ 2 dará como resultado el valor (inverso de los bits):

 1111 1111 1111 1101 

¿Cómo es que en el mundo sé que es -3? Bueno, es -3 porque se deriva de la representación complementaria de 3 de 3.

Como sabemos 2’s (x) = 1’s (x) + 1 ( https://delightlylinux.wordpress.com/2014/10/13/binary-lesson-12-ones-complement-and-twos-complement/ )
Nuestro objective es encontrar x :
1’s (x) = 2’s (x) – 1 (basado en la expresión previa)

Como nuestra respuesta está en el cumplido de 2,
1’s (x) = 1111 1111 1111 1101 - 0000 0000 0000 0001
1’s (x) = 1111 1111 1111 1100 (Cómo restar – http://sandbox.mc.edu/~bennet/cs110/pm/sub.html )

Por lo tanto, x = 1 cumplido de valor (ya que la respuesta que obtenemos representa el cumplido de 1 de x).
x = 0000 0000 0000 0011
Entonces, hemos encontrado que x es 3 y, por lo tanto, nuestro resultado previo de ~ operator 1111 1111 1111 1101 es -3 escrito como complemento de 2 de 3.

De los documentos oficiales http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html :

El operador complementario bit a bit “~” invierte un patrón de bits; se puede aplicar a cualquiera de los tipos integrales, haciendo que cada “0” sea “1” y cada “1” sea “0”. Por ejemplo, un byte contiene 8 bits; aplicar este operador a un valor cuyo patrón de bits es “00000000” cambiaría su patrón a “11111111”.