Java: O que significa ~
-
18-09-2019 - |
Pergunta
Neste código -fonte Java, tenho esta linha:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
O que o tilde ~
significa?
Solução
O tilde (~
) executa um complemento bit -butwise de um valor numérico em Java.
Outras dicas
É o Complemento unário ~ bit operador (citando) :
- usado apenas com valores inteiros
- inverte os bits, ou seja, um 0 bit se torna 1 bit e vice-versa
- Em todos os casos ~ x é igual a (-x) -1
Veja também Esta página em operadores bitwise na Wikipedia, quais Estados :
O bitwise não, ou complemento, é uma operação unária que executa a negação lógica em cada bit, formando o complemento do valor binário fornecido. Dígitos que eram 0 se tornam 1 e vice -versa.
Por exemplo:
NOT 0111 (decimal 7)
= 1000 (decimal 8)
Em muitas linguagens de programação (incluindo os da família C), o operador não é "
~
"(Tilde).
Do site de Java http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
O operador unário de complemento bit "~" inverte um padrão um pouco; Pode ser aplicado a qualquer um dos tipos integrais, tornando cada "0" A "1" e cada "1" A "0". Por exemplo, um byte contém 8 bits; A aplicação desse operador a um valor cujo padrão de bits é "00000000" mudaria seu padrão para "11111111".
Agora, como respondido anteriormente por Pascal Martin, a qualquer caso o VLAue é igual a -(x) -1. Por exemplo ~ 2 = -3, ~ -6 = 5, etc.
Além disso, em Java All números inteiros positivos são armazenados como suas representações binárias e números inteiros negativos são armazenados no valor de elogio de 2 de um número inteiro positivo.
Agora, vamos ver como funciona em nível de bit em caso de ~ 2 = -3:
Inicialmente, 2 é armazenado em sua representação binária:
0000 0000 0000 0010
Agora ~ 2 resultará no valor (inverso nos bits):
1111 1111 1111 1101
Como no mundo eu sei que é -3? Bem, é -3 porque é derivado da representação de elogios de 2 de 3.
Como sabemos 2 (x) = 1's (x) + 1 (https://delightlylinux.wordpress.com/2014/10/13/binary-lesson-12-ones-clemplement-and--twos-clemment/)
Nosso objetivo é encontrar x:
1's (x) = 2's (x) - 1 (com base na expressão anterior)
Como nossa resposta está no elogio de 2,
1 (x) = 1111 1111 1111 1101 - 0000 0000 0000 0001
1 (x) = 1111 1111 1111 1100
(Como subtrair -http://sandbox.mc.edu/~bennet/cs110/pm/sub.html)
Portanto, x = 1 elogio de valor (como a resposta que obtemos representa o elogio de X).
x = 0000 0000 0000 0011
Então, descobrimos que X é 3 e, portanto, nosso resultado anterior de ~ operador 1111 1111 1111 1101
é -3 escrito como o elogio de 3 de 3.
Como dito antes ~
é o operador unário e não.
Seu exemplo testa se modifiers
contém outros bits além dos definidos em KeyEvent.SHIFT_MASK
.
~KeyEvent.SHIFT_MASK
-> Todos os bits, exceto os do keyevent.shift_mask, estão definidos como 1.(modifiers & ~KeyEvent.SHIFT_MASK)
-> Cada 1 bit emmodifiers
que "não pertence" aKeyEvent.SHIFT_MASK
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0)
-> Se houvesse pelo menos um outro bit como 1 além deKeyEvent.SHIFT_MASK
faça alguma coisa...
Dos documentos oficiais http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html:
O operador unário de complemento bit "~" inverte um padrão um pouco; Pode ser aplicado a qualquer um dos tipos integrais, tornando cada "0" A "1" e cada "1" A "0". Por exemplo, um byte contém 8 bits; A aplicação desse operador a um valor cujo padrão de bits é "00000000" mudaria seu padrão para "11111111".