在这个 Java 源代码中,我有这一行:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
波浪号~
是什么意思?
在这个 Java 源代码中,我有这一行:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
波浪号~
是什么意思?
波浪号 ( ~
) 在 Java 中执行数值的按位补码。
它是一元〜按位补码运算符(引用):
另请参阅维基百科上的按位运算符的此页面,其中指出:
按位非或补码是一种一元运算,它对每个位执行逻辑否定,形成给定二进制值的反码。为 0 的数字变为 1,反之亦然。
例如:
NOT 0111 (decimal 7)
= 1000 (decimal 8)
在许多编程语言 (包括 C 系列中的那些)中,按位 NOT 运算符是“
~
”(波浪号)。
来自 Java 的网站http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
一元按位补码运算符“~”反转位模式;它可以应用于任何整数类型,使每个“0”成为“1”,每个“1”成为“0”。例如,一个字节包含 8 位;将此运算符应用于位模式为“00000000”的值会将其模式更改为“11111111”。
现在,正如 Pascal MARTIN 先前回答的那样,在任何给定情况下,该值都等于 -(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's(x)= 1's(x) + 1 ( https://delightlylinux.wordpress.com/2014/10/13/binary-lesson-12-ones-complement-and-twos-complement/ )
我们的目标是否找到 x :
1's(x)= 2's(x) - 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's价值的恭维(因为我们得到的答案代表 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)
modifiers
-> “不属于”的每个 1 位KeyEvent.SHIFT_MASK
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0)
KeyEvent.SHIFT_MASK
-> 如果除了做某事之外至少还有一个其他位设置为 1 ...来自官方文档http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html:
一元按位补码运算符“~”反转位模式;它可以应用于任何整数类型,使每个“0”成为“1”,每个“1”成为“0”。例如,一个字节包含 8 位;将此运算符应用于位模式为“00000000”的值会将其模式更改为“11111111”。