Java: Що означає ~


Відповіді:



53

Це Одинарний ~ Побітовий оператор доповнення (цитування) :

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

Дивіться також цю сторінку про побітові оператори на wikipedia , де зазначено:

Побітове НЕ, або доповнення, є унарною операцією, яка виконує логічне заперечення кожного біта, формуючи доповнення даного двійкового значення. Цифри, які були 0, стають 1, і навпаки.
Наприклад:

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

У багатьох мовах програмування (у тому числі в сімействі C) побітовим оператором NOT є " ~" (тильда).


14

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

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

Тепер, як раніше відповів Паскаль МАРТІН, у будь-якому випадку значення дорівнює - (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).
х = 0000 0000 0000 0011
Отже, ми виявили, що х - 3, а отже, наш попередній результат оператора ~ 1111 1111 1111 1101- -3, записаний як комплімент 2 3.


9

Як вже було сказано, ~це одинарний побітовий оператор 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щоб щось зробити ...

3

З офіційних документів http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html :

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.