En el código fuente de Java tengo esta línea:Java: ¿Qué quiere decir ~
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
¿Qué significa la tilde ~
?
En el código fuente de Java tengo esta línea:Java: ¿Qué quiere decir ~
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
¿Qué significa la tilde ~
?
La Tilde (~
) realiza un complemento bit a bit de un valor numérico en Java.
Ver: Bitwise complement (~
): inverts ones and zeroes in a number
Es el operador Unary ~ Bitwise complement(donde se cita):
Véase también this page on Bitwise operators on wikipedia, que establece:
El bit a bit NOT, o complementar, es una operación unaria que realiza lógico negación en cada bit, formando complemento del valor binario dadas las queridos. 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 programación (incluyendo los de la familia C), el bit a bit NO operador es "
~
" (tilde).
A partir de los documentos oficiales http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html:
El operador de bits complemento unario "~" 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".
Como se dijo antes ~
es el operador NOT bit a bit unario.
Su ejemplo prueba si modifiers
contiene bits distintos de los definidos en KeyEvent.SHIFT_MASK
.
~KeyEvent.SHIFT_MASK
- > todos los bits excepto los de KeyEvent.SHIFT_MASK se establecen en 1.(modifiers & ~KeyEvent.SHIFT_MASK)
- > cada 1-bit en modifiers
que "no pertenece" a KeyEvent.SHIFT_MASK
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0)
- > si hay fue al menos otro bit establecido en 1 además de KeyEvent.SHIFT_MASK
hacer algo ...Desde la página web de Java http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
El unario operador de bits complemento "~" invierte un patrón de bits; se puede aplicar a cualquiera de los tipos integrales, por lo que cada "0" es un "1" y cada "1" un "0". Por ejemplo, un byte contiene 8 bits; aplicando 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. P.ej. ~ 2 = -3, -6 ~ = 5, etc.
También, en java todos enteros positivos se almacenan como sus representaciones binarias y enteros negativos se almacenan en valor cumplido de 2 de un entero positivo.
Ahora, vamos a ver cómo funciona en nivel de bits en el caso de ~ 2 = -3:
Inicialmente, 2 se almacena en su representación binaria:
0000 0000 0000 0010
Ahora ~ 2, obtendrá el valor (inverso los bits):
1111 1111 1111 1101
¿Cómo en el mundo que conozco es -3? Bueno, es -3, ya que se deriva de la representación complemento de 2 de 3.
Como sabemos de 2 (x) = de 1 (x) + 1 (https://delightlylinux.wordpress.com/2014/10/13/binary-lesson-12-ones-complement-and-twos-complement/)
Nuestro objetivo es encontrar x :
de 1 (x) = 2 de (x) - 1 (basado en la expresión anterior)
a medida que nuestra respuesta está en está en el cumplido de 2,
1 de (x) = 1111 1111 1111 1101 - 0000 0000 0000 0001
1 de (x) = 1111 1111 1111 1100
(Cómo restar - http://sandbox.mc.edu/~bennet/cs110/pm/sub.html)
Por lo tanto, x = 1 es un cumplido de valor (ya que la respuesta que obtenemos representa 1 cumplido de x).
x = 0000 0000 0000 0011
Así, hemos encontrado que x es 3 y por lo tanto nuestro resultado anterior del operador ~ 1111 1111 1111 1101
se -3 escrito como complemento de 3.