このJavaソースコードには次の行があります。
if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
チルダ~
意味?
ティルド(~
)Javaで数値のビット単位の補数を実行します。
単項〜ビット単位の補数 演算子(引用):
ウィキペディアのビット単位演算子に関するこのページ も参照してください。
ビット単位のNOT(補数)は、各ビットの論理否定を実行する単項演算であり、指定されたバイナリ値の1の補数を形成します。 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が答えたように、どのような場合でも、vlaueは-(x)-1に等しくなります。例えば。 〜2 = -3、〜-6 = 5など.
また、Java all正整数はバイナリ表現として保存され、負の整数は、正の整数の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- 2の補数/ )
私たちの目的は、xを見つけることです。
1's(x)= 2's(x)-1(前の式に基づいて)
答えは2の賛辞であるため、
1's(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
is -3は、2の3の補数として記述されます。
前に述べたように、~
は単項ビット単位のNOT演算子です。
この例では、modifiers
にKeyEvent.SHIFT_MASK
で定義されている以外のビットが含まれているかどうかをテストします。
~KeyEvent.SHIFT_MASK
-> KeyEvent.SHIFT_MASKのビットを除くすべてのビットが1に設定されます。(modifiers & ~KeyEvent.SHIFT_MASK)
-> KeyEvent.SHIFT_MASK
に「属さない」modifiers
の1ビットごとif ((modifiers & ~KeyEvent.SHIFT_MASK) != 0)
-> KeyEvent.SHIFT_MASK
以外に少なくとも1つのビットが1に設定されていた場合...公式ドキュメントから http://Java.Sun.com/docs/books/tutorial/Java/nutsandbolts/op3.html :
単項ビット単位の補数演算子「〜」は、ビットパターンを反転します。すべての整数型に適用でき、すべての「0」を「1」、すべての「1」を「0」にします。たとえば、バイトには8ビットが含まれます。この演算子をビットパターンが「00000000」の値に適用すると、そのパターンは「11111111」に変更されます。