なぜビット演算(~0);
は -1 を出力するのですか? バイナリでは、0 を 1 にする必要はありません。なぜ ?
10 に答える
あなたは実際にはかなり近いです。
バイナリでは、0 は 1 であってはなりません
はい、これはまったく正しいことです。
ただし、int
値が 0 の は、実際にはすべてゼロの 32 ビットです。~
32 個の 0 をすべて 32 個の 1 に反転します。
System.out.println(Integer.toBinaryString(~0));
// prints "11111111111111111111111111111111"
これは の 2 の補数表現です-1
。
同様に:
System.out.println(Integer.toBinaryString(~1));
// prints "11111111111111111111111111111110"
つまりint
、2 の補数表現の 32 ビット符号なしの場合、~1 == -2
.
参考文献:
- 2 の補数
- これは、符号付き数値をビット単位で表現するために Java (とりわけ) で使用されるシステムです。
- JLS 15.15.5 ビット単位の補数演算子
~
~x
"すべての場合に等しいことに注意してください(-x)-1
"
あなたが実際に言っているのは ~0x00000000 であり、その結果は 0xFFFFFFFF になります。Java の (signed) int の場合、これは -1 を意味します。
符号付き数値の最初のビットが -(2 x -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 の補数形式のいくつかの数値とそのビット単位の not ~
(そのすぐ下):
0 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 = 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 = 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 進反転で、2 番目の補数では -1 は 0 の 2 進反転です。
ここで 0 はビットではありません。それはバイトです(少なくとも;またはそれ以上)-00000000。ビットごとに使用するか、11111111になります。符号付き整数として-1です...
本当の理由は ~ が 2 の補数だからだと思います。
ほとんどのプログラミング言語では、チルダは 1 の補数のビット トグルを表しますが、Javascript は文字チルダ ~ を 2 の補数として指定します。
32 ビット符号付き整数の場合
~00000000000000000000000000000000=11111111111111111111111111111111
(これは -1 です)