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



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



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


что делает Тильда ~ в смысле?

565   5  

5 ответов:

Тильды (~) выполняет побитовое дополнение числового значения в Java.

посмотреть: побитовое дополнение (~): инвертирует единицы и нули в число

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

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

см. также эта страница О побитовых операторах в Википедии, в которой говорится :

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

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

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

С сайта 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(х)= 1(х) + 1 (https://delightlylinux.wordpress.com/2014/10/13/binary-lesson-12-ones-complement-and-twos-complement/)
нашей целью является то, чтобы найти х:
1(х)= 2(х) - 1 (на основе предыдущего выражения)

как наш ответ в том в 2-х комплимент,
1's (x)= 1111 1111 1111 1101 - 0000 0000 0000 0001
1's (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 и, следовательно, наш предыдущий результат ~ operator 1111 1111 1111 1101это -3 написано как комплимент 2 из 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 что-то делать...

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

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

Comments

    Ничего не найдено.