Подтвердить что ты не робот

Java: что означает ~

В этом исходном коде Java у меня есть эта строка:

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

Что означает тильда ~?

4b9b3361

Ответ 2

Это Unary ~ Побитовое дополнение оператор (цитирование):

  • используется только с целыми значениями
  • инвертирует биты, то есть 0-бит становится 1-бит и наоборот
  • во всех случаях ~ x равно (-x) -1

См. также эту страницу по Побитовые операторы в wikipedia, в которой говорится:

Побитовое NOT или дополнение - это унарная операция, выполняющая логические отрицание на каждом бите, формирование их дополнение к данному двоичному стоимость. Цифры, которые были 0, становятся 1, и наоборот.
Например:

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

Во многих языках программирования (в том числе в семействе C), побитовым оператором NOT является "~" (Тильда).

Ответ 3

Как уже говорилось, ~ - это унитарный побитовый оператор NOT.
В вашем примере проверяется, содержит ли modifiers биты, отличные от тех, которые определены в KeyEvent.SHIFT_MASK.

  • ~KeyEvent.SHIFT_MASK → все биты, кроме тех, что указаны в KeyEvent.SHIFT_MASK, равны 1.
  • (modifiers & ~KeyEvent.SHIFT_MASK) → каждый 1-бит в modifiers, который не относится к KeyEvent.SHIFT_MASK
  • if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) → если бы был хотя бы один бит, установленный в 1, кроме KeyEvent.SHIFT_MASK сделать что-то...

Ответ 4

На веб-сайте Java http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

Унарный побитовый оператор дополнения "~" инвертирует бит-шаблон; Это может применяться к любому из интегральных типов, делая каждое "0" a "1", и каждый "1" a "0". Например, байт содержит 8 бит; применение этот оператор к значению, бит-бит которого "00000000", изменится его шаблон "11111111".

Теперь, как ранее ответил Паскаль МАРТИН, в любом случае значение vlaue равно - (x) -1. Например. ~ 2 = -3, ~ -6 = 5 и т.д.

Кроме того, в java все положительные целые числа сохраняются как их двоичные представления, а отрицательные целые числа хранятся в 2 значениях комплимента положительного целого числа.

Теперь посмотрим, как он работает на уровне бит в случае ~ 2 = -3:

Изначально 2 хранится в двоичном представлении:

0000 0000 0000 0010

Теперь ~ 2 приведет к значению (инвертирует биты):

1111 1111 1111 1101

Как в мире я знаю, что это -3? Ну, это -3, потому что он получен из 2-х комплиментных представлений 3.

Как мы знаем, 2 (x) = 1 (x) + 1 (https://delightlylinux.wordpress.com/2014/10/13/binary-lesson-12-ones-complement-and-twos-complement/)
Наша цель - найти x:
1 (x) = 2 (x) - 1 (на основе предыдущего выражения)

Как наш ответ находится в 2 комплиментах,
1 (x) = 1111 1111 1111 1101 - 0000 0000 0000 0001
1 (x) = 1111 1111 1111 1100 (Как вычесть - http://sandbox.mc.edu/~bennet/cs110/pm/sub.html)

Поэтому x = 1 комплимент значения (поскольку полученный нами ответ представляет собой 1 комплимент x).
x = 0000 0000 0000 0011. Итак, мы обнаружили, что x равно 3, и, следовательно, наш предыдущий результат оператора ~ t25 > -3 написан как 2 комплимента 3.

Ответ 5

Из официальных документов http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html:

Унарный побитовый оператор дополнения "~" инвертирует бит-шаблон; он может применяться к любому из интегральных типов, делая каждый "0" a "1" и каждый "1" a "0". Например, байт содержит 8 бит; применяя этот оператор к значению, бит-бит которого "00000000" изменит его шаблон на "11111111".