の背後にある論理に疑問がありx &(~0 <<n)
ます。
まず意味が分からなかった~0
。Javaでこれを試したところ、-1
. -1
2 進数で表し、それを正の数と区別するにはどうすればよいでしょうか?
2 に答える
負の数を表す最も一般的な方法 (および Java が使用する方法) は、2 の補数と呼ばれます。私のコメントで述べたように、このシステムでマイナスを計算する 1 つの方法は-x = ~(x - 1)
. もう 1 つの同等の方法は、 です-x = ~x + 1
。
たとえば、8ビットでは、
00000001 // 1
00000000 // 1 - 1
11111111 // ~(1 - 1) = ~0 = -1
に 1 を11111111
加えると 0 になります。「1 を加えると 0 になるような数」から 1 を引いたものと呼ぶのが理にかなっています。
最上位ビットが設定された数値は負と見なされます。
私がリンクしたウィキペディアの記事には、より多くの情報が含まれています。
についてはx & (~0 << n)
、~0
「すべてのもの」を表す方法にすぎません (これはたまたま -1 であり、この使用には実際には関係ありません)。ほとんどn
の場合、左にシフトされた「すべて1」は、ゼロn
が続く一連の1です。n
全体として、その式は の下位n
ビットをクリアしますx
。少なくとも、0 <= n <= 31
.
a << n
Java では、 は でa
ありint
、 は と同等a << (n & 31)
です。
バイト 0 のすべてのビットは 0 であり、-1 のすべてのビットは 1 であるため、0 のビットごとの否定は -1 です。
したがって、~0 は -1 です。
質問の残りの部分については、実際に何を求めていますか?