82

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

if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....

波浪号~是什么意思?

4

5 回答 5

75

波浪号 ( ~) 在 Java 中执行数值的按位补码。

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

于 2009-09-27T12:39:29.203 回答
55

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

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

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

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

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

在许多编程语言 (包括 C 系列中的那些)中,按位 NOT 运算符是“ ~”(波浪号)。

于 2009-09-27T12:38:38.407 回答
19

来自 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 的补码。

于 2017-02-18T05:30:50.220 回答
10

如前所述~,一元按位非运算符。
您的示例测试是否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 ...
于 2009-09-27T12:58:56.563 回答
3

来自官方文档http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html

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

于 2009-09-27T12:42:07.953 回答