Java:什么意思

Mar*_*aux 72 java syntax operators special-characters

在这个Java源代码中我有这一行:

if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Run Code Online (Sandbox Code Playgroud)

道尔顿~是什么意思?

Ric*_*ard 66

Tilde(~)在Java中执行数值的按位补码.

请参阅:按位补码(~):将数字中的1和0反转


Pas*_*TIN 52

它是一元〜按位补码运算符(引用):

  • 仅用于整数值
  • 将比特反转,即0比特变为1比特,反之亦然
  • 在所有情况下~x等于(-x)-1

另请参阅维基百科上的按位运算符此页面,其中指出:

按位NOT或补码是一元运算,对每个位执行逻辑否定,形成给定二进制值的1的补码.0的数字变为1,反之亦然.
例如:

NOT 0111  (decimal 7)
  = 1000  (decimal 8)
Run Code Online (Sandbox Code Playgroud)

在许多编程语言(包括C系列中的编程语言 )中,按位NOT运算符是" ~"(代字号).


Dhw*_*eel 11

来自Java的网站http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

一元按位补码运算符"〜"反转位模式; 它可以应用于任何整数类型,使每个"0"为"1",每个"1"为"0".例如,一个字节包含8位; 将此运算符应用于位模式为"00000000"的值会将其模式更改为"11111111".

现在,正如Pascal MARTIN先前所回答的那样,在任何给定的情况下,vlaue等于 - (x)-1.例如~2 = -3,~6 = 5等

此外,在java中,所有正整数都存储为二进制表示,负整数存储在正整数的2的补码值中.

现在,让我们看看它在~2 = -3的情况下如何在位级工作:

最初,2以二进制表示形式存储:

0000 0000 0000 0010
Run Code Online (Sandbox Code Playgroud)

现在~2将导致值(反转位):

1111 1111 1111 1101
Run Code Online (Sandbox Code Playgroud)

世界上我怎么知道它是-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的恭维价值(因为我们得到的答案代表了对x的赞美).
x = 0000 0000 0000 0011
所以,我们发现x是3,因此我们先前的〜运算符的结果1111 1111 1111 1101是-3写为2的3的补码.


Vol*_*erK 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做某事......