Pergunta

Neste código -fonte Java, tenho esta linha:

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

O que o tilde ~ significa?

Foi útil?

Solução

O tilde (~) executa um complemento bit -butwise de um valor numérico em Java.

Ver: Complemento bit~): inverteu e zeros em um número

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 em modifiers que "não pertence" a KeyEvent.SHIFT_MASK
  • if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) -> Se houvesse pelo menos um outro bit como 1 além de KeyEvent.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".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top