なぜビット演算(~0);
-1を出力しますか?バイナリでは、0ではなく1でなければなりません。どうして ?
あなたは実際に非常に近いです。
バイナリでは、0は1ではありません
はい、私たちが少し話しているとき、これは絶対に正しいです。
ただし、値が0のint
は、実際にはすべてゼロの32ビットです。 ~
は、32個のゼロすべてを32個の1に反転します。
System.out.println(Integer.toBinaryString(~0));
// prints "11111111111111111111111111111111"
これは、-1
の2の補数表現です。
同様に:
System.out.println(Integer.toBinaryString(~1));
// prints "11111111111111111111111111111110"
つまり、2の補数表現の~1 == -2
の32ビット符号なしint
の場合です。
参考文献:
~
~x
は(-x)-1
と等しいことに注意してください。」符号付き数値の最初のビットが-(2x -1)ここで、xはビット数です。
したがって、8ビットの数値を指定すると、各ビットの値(左から右の順序)は次のようになります。
-128 64 32 16 8 4 2 1
現在、バイナリでは、0は明らかにすべて0です。
-128 64 32 16 8 4 2 1
0 0 0 0 0 0 0 0 0 = 0
そして、ビット単位ではなく~
これらの0はそれぞれ1になります。
-128 64 32 16 8 4 2 1
~0 1 1 1 1 1 1 1 1
= -128+64+32+16+8+4+2+1 == -1
これは、オーバーフローの理解にも役立ちます。
-128 64 32 16 8 4 2 1
126 0 1 1 1 1 1 1 0 = 126
+1 0 1 1 1 1 1 1 1 = 127
+1 1 0 0 0 0 0 0 0 = -128 overflow!
~
はビットごとの演算子です。
~0 = 1 which is -1 in 2's complement form
http://en.wikipedia.org/wiki/Two's_complement
2の補数形式の一部の数値とビット単位ではない~
(それらのすぐ下):
0 1 1 1 1 1 1 1 1 = 127
1 0 0 0 0 0 0 0 = -1280 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = −1271 1 1 1 1 1 1 1 = −1
0 0 0 0 0 0 0 0 0 = 01 1 1 1 1 1 1 0 = −2
0 0 0 0 0 0 0 1 = 11 0 0 0 0 0 0 1 = −127
0 1 1 1 1 1 1 0 = 1261 0 0 0 0 0 0 0 = −128
0 1 1 1 1 1 1 1 = 127
なぜなら~
はバイナリ反転ではなく、ビットごとの反転です。バイナリ反転は!
および(Javaでは)ブール値にのみ適用できます。
標準のバイナリエンコーディングでは、0はすべて0で、~
はビット単位のNOTです。符号付き整数型の場合、1はすべて(ほとんどの場合)-1です。したがって、符号付きバイト型の場合:
0xFF = -1 // 1111 1111
0xFE = -2 // 1111 1110
...
0xF0 = -128 // 1000 0000
0x7F = 127 // 0111 1111
0x7E = 126 // 0111 1110
...
0x01 = 1 // 0000 0001
0x00 = 0 // 0000 0000
これはバイナリ反転であり、2番目の補数-1は0のバイナリ反転です。
ここの0は少しではありません。これはバイトです(少なくとも;以上)-00000000。ビット単位を使用するか、11111111になります。符号付き整数として-1です。
32ビット符号付き整数の場合
~00000000000000000000000000000000=11111111111111111111111111111111
(-1です)
本当の理由は〜が2の補数だからだと思います。
Javascriptでは、ほとんどのプログラミング言語でチルダが1の補数のビットトグルを表しますが、2の補数を表すチルダ〜を指定します。