~ 是什么意思

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

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

波浪 ~是什么意思?

68017 次浏览

It is the Unary ~ Bitwise complement operator (quoting) :

  • only used with integer values
  • inverts the bits ie a 0-bit becomes 1-bit and vice versa
  • in all cases ~x equals (-x)-1

See also this page on Bitwise operators on wikipedia, which states :

The bitwise NOT, or complement, is a unary operation that performs logical negation on each bit, forming the ones' complement of the given binary value. Digits which were 0 become 1, and vice versa.
For example:

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

In many programming languages (including those in the C family), the bitwise NOT operator is "~" (tilde).

The Tilde (~) performs a bitwise complement of a numerical value in Java.

See: Bitwise complement (~): inverts ones and zeroes in a number

From the official docs http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html:

The unary bitwise complement operator "~" inverts a bit pattern; it can be applied to any of the integral types, making every "0" a "1" and every "1" a "0". For example, a byte contains 8 bits; applying this operator to a value whose bit pattern is "00000000" would change its pattern to "11111111".

As said before ~ is the unary bitwise NOT operator.
Your example tests whether modifiers contains bits other than those defined in KeyEvent.SHIFT_MASK.

  • ~KeyEvent.SHIFT_MASK -> all bits except those in KeyEvent.SHIFT_MASK are set to 1.
  • (modifiers & ~KeyEvent.SHIFT_MASK) -> every 1-bit in modifiers that "does not belong" to KeyEvent.SHIFT_MASK
  • if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) -> if there was at least one other bit set to 1 besides KeyEvent.SHIFT_MASK do something...

From Java's website http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

The unary bitwise complement operator "~" inverts a bit pattern; it can be applied to any of the integral types, making every "0" a "1" and every "1" a "0". For example, a byte contains 8 bits; applying this operator to a value whose bit pattern is "00000000" would change its pattern to "11111111".

Now, as previously answered by Pascal MARTIN, at any given case the value equals to -(x)-1. E.g. ~2=-3, ~-6=5, etc.

Also, in java all positive integers are stored as their binary representations and negative integers are stored in 2's complement value of a positive integer.

Now, let's see how it works in bit level in case of ~2=-3:

Initially, 2 is stored in its binary representation:

0000 0000 0000 0010

Now ~2 will result in the value (inverse the bits):

1111 1111 1111 1101

How in the world I know it is -3? Well, it is -3 because it is derived from 2's complement representation of 3.

As we know 2's(x)= 1's(x) + 1 (https://delightlylinux.wordpress.com/2014/10/13/binary-lesson-12-ones-complement-and-twos-complement/)
Our aim is it to find x:
1's(x)= 2's(x) - 1 (based on previous expression)

As our answer is in is in 2's complement,
1's(x)= 1111 1111 1111 1101 - 0000 0000 0000 0001
1's (x)= 1111 1111 1111 1100 (How to subtract -http://sandbox.mc.edu/~bennet/cs110/pm/sub.html)

Therefore x= 1's complement of value (as the answer we got represents 1's complement of x).
x = 0000 0000 0000 0011
So, we have found that x is 3 and hence our previous result of ~ operator 1111 1111 1111 1101is -3 written as 2's complement of 3.