В этом исходном коде Java у меня есть эта строка:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Что означает тильда ~
?
В этом исходном коде Java у меня есть эта строка:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Что означает тильда ~
?
Тильда (~) выполняет побитовое дополнение численного значения в Java.
Смотрите: Побитовое дополнение (~): инвертирует и нули в количестве
Это Unary ~ Побитовое дополнение оператор (цитирование):
См. также эту страницу по Побитовые операторы в wikipedia, в которой говорится:
Побитовое NOT или дополнение - это унарная операция, выполняющая логические отрицание на каждом бите, формирование их дополнение к данному двоичному стоимость. Цифры, которые были 0, становятся 1, и наоборот.
Например:
NOT 0111 (decimal 7)
= 1000 (decimal 8)
Во многих языках программирования (в том числе в семействе C), побитовым оператором NOT является "
~
" (Тильда).
Как уже говорилось, ~ - это унитарный побитовый оператор 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
сделать что-то...На веб-сайте 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.
Из официальных документов http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html:
Унарный побитовый оператор дополнения "~" инвертирует бит-шаблон; он может применяться к любому из интегральных типов, делая каждый "0" a "1" и каждый "1" a "0". Например, байт содержит 8 бит; применяя этот оператор к значению, бит-бит которого "00000000" изменит его шаблон на "11111111".