logical - java special characters
Java: ¿Qué significa ~? (5)
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 enmodifiers
que "no pertenecen" aKeyEvent.SHIFT_MASK
-
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0)
-> si había al menos otro bit configurado en 1 además deKeyEvent.SHIFT_MASK
hacer algo ...
En este código fuente de Java, tengo esta línea:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
¿Qué significa la tilde ~
?
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".
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 objetivo 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.
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 programación (incluidos los de la familia C) , el operador NOT bit a bit es "
~
" (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