Вопрос

В этом исходном коде 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».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top