web-dev-qa-db-ja.com

ビットごとのNOT演算子

なぜビット演算(~0); -1を出力しますか?バイナリでは、0ではなく1でなければなりません。どうして ?

41
Sawyer

あなたは実際に非常に近いです。

バイナリでは、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の場合です。


参考文献:

68

符号付き数値の最初のビットが-(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!
9
nickf

~はビットごとの演算子です。

~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 = -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 = 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 1 = 127

7
N 1.1

なぜなら~はバイナリ反転ではなく、ビットごとの反転です。バイナリ反転は!および(Javaでは)ブール値にのみ適用できます。

3
Bombe

標準のバイナリエンコーディングでは、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
1
cletus

これはバイナリ反転であり、2番目の補数-1は0のバイナリ反転です。

0
Daniel Fath

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

0
kpower

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

~00000000000000000000000000000000=11111111111111111111111111111111(-1です)

0
YOU

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

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

0
Nacho