Java: Что значит ~
-
18-09-2019 - |
Вопрос
В этом исходном коде Java у меня есть эта строка:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Что делает Тильда ~
иметь в виду?
Решение
Тильда (~
) выполняет кусочек дополнения численного значения в Java.
Видеть: Побитовое дополнение (~
): инверты и нули в количестве
Другие советы
Это Беспрепятственный дополнение оператор (цитируя) :
- используется только с целочисленными значениями
- переворачивает биты, то есть 0-бит становится 1-битным и наоборот
- Во всех случаях ~ x равно (-x) -1
Смотрите также Эта страница на битовых операторах в Википедии, в котором говорится:
Bitwise Not, или комплемент, представляет собой уникальную операцию, которая выполняет логическое отрицание по каждому биту, формируя дополнение заданного двоичного значения. Цифры, которые были 0, становятся 1, и наоборот.
Например:
NOT 0111 (decimal 7)
= 1000 (decimal 8)
Во многих языках программирования (в том числе в семье C), бить, а не оператор "
~
"(Тильде).
С сайта 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-ons-complome-and-twos-complome/)
Наша цель - найти 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 и, следовательно, наш предыдущий результат ~ оператор 1111 1111 1111 1101
является -3, написано как комплимент 2 3.
Как сказано ранее ~
это бессмысленный оператор.
Ваш пример проверяет, 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
сделай что-нибудь...
От официальных документов http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html:
Унарный оператор по битовому комплементу "~" переворачивает бит -шаблон; Это может быть применено к любому из интегральных типов, делая каждый «0» A «1» и каждый «1» A «0». Например, байт содержит 8 битов; Применение этого оператора к значению, схема битов, «00000000», изменит свой шаблон на «11111111».