在此Java源代码中,我有以下代码行:
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
波浪号~
是什么意思?
Answers:
Tilde(~
)在Java中执行数值的按位补码。
它是一元〜逐位补运算符(引用):
另请参阅Wikipedia上有关按位运算符的页面,该页面指出:
按位NOT或补码是一元运算,对每个位执行逻辑求反,形成给定二进制值的一个补码。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的(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。
如前所述,~
是一元按位NOT运算符。
您的示例测试了是否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)
->如果还有其他设置为1的位KeyEvent.SHIFT_MASK
...从官方文档http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html:
一元按位补数运算符“〜”反转位模式;它可以应用于任何整数类型,每个“ 0”为“ 1”,每个“ 1”为“ 0”。例如,一个字节包含8位。如果将此运算符应用于位模式为“ 00000000”的值,则会将其模式更改为“ 11111111”。