47

なぜビット演算(~0);は -1 を出力するのですか? バイナリでは、0 を 1 にする必要はありません。なぜ ?

4

10 に答える 10

77

あなたは実際にはかなり近いです。

バイナリでは、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.


参考文献:

于 2010-03-25T07:10:37.570 に答える
13

あなたが実際に言っているのは ~0x00000000 であり、その結果は 0xFFFFFFFF になります。Java の (signed) int の場合、これは -1 を意味します。

于 2010-03-25T06:44:26.237 に答える
9

符号付き数値の最初のビットが -(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!
于 2010-03-25T06:54:33.553 に答える
7

~ビット演算子です。

~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 = −128

0 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = −127

1 1 1 1 1 1 1 1 = −1
0 0 0 0 0 0 0 0 = 0

1 1 1 1 1 1 1 0 = −2
0 0 0 0 0 0 0 1 = 1

1 0 0 0 0 0 0 1 = −127
0 1 1 1 1 1 1 0 = 126

1 0 0 0 0 0 0 0 = −128
0 1 1 1 1 1 1 = 127

于 2010-03-25T06:44:35.753 に答える
5

~はバイナリ反転ではないため、ビットごとの反転です。バイナリ反転は!、(Java では) ブール値にのみ適用できます。

于 2010-03-25T06:42:06.217 に答える
2

標準のバイナリ エンコーディングでは、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
于 2010-03-25T06:43:22.103 に答える
0

これは 2 進反転で、2 番目の補数では -1 は 0 の 2 進反転です。

于 2010-03-25T06:43:50.320 に答える
0

ここで 0 はビットではありません。それはバイトです(少なくとも;またはそれ以上)-00000000。ビットごとに使用するか、11111111になります。符号付き整数として-1です...

于 2010-03-25T06:46:26.950 に答える
0

本当の理由は ~ が 2 の補数だからだと思います。

ほとんどのプログラミング言語では、チルダは 1 の補数のビット トグルを表しますが、Javascript は文字チルダ ~ を 2 の補数として指定します。

于 2013-02-09T14:16:22.177 に答える
0

32 ビット符号付き整数の場合

~00000000000000000000000000000000=11111111111111111111111111111111(これは -1 です)

于 2010-03-25T06:46:37.900 に答える