У цьому вихідному коді Java у мене є такий рядок:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Що означає тильда ~
?
У цьому вихідному коді Java у мене є такий рядок:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Що означає тильда ~
?
Відповіді:
Tilde ( ~
) виконує побітове доповнення числового значення в Java.
Див .: Побітове доповнення ( ~
): інвертує одиниці та нулі в число
Це Одинарний ~ Побітовий оператор доповнення (цитування) :
Дивіться також цю сторінку про побітові оператори на wikipedia , де зазначено:
Побітове НЕ, або доповнення, є унарною операцією, яка виконує логічне заперечення кожного біта, формуючи доповнення даного двійкового значення. Цифри, які були 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".
Тепер, як раніше відповів Паскаль МАРТІН, у будь-якому випадку значення дорівнює - (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.
Як вже було сказано, ~
це одинарний побітовий оператор 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".