web-dev-qa-db-fra.com

bitwise not operator 

Pourquoi l'opération au niveau du bit (~0); imprime -1? En binaire, pas 0 devrait être 1. Pourquoi ?

39
Sawyer

Vous êtes en fait assez proche.

En binaire, pas 0 devrait être 1 

Oui, c'est tout à fait correct quand on parle d'un bit.

CEPENDANT, une int dont la valeur est 0 correspond en réalité à 32 bits de tous les zéros! ~ inverse les 32 zéros en 32.

System.out.println(Integer.toBinaryString(~0));
// prints "11111111111111111111111111111111"

Ceci est la représentation du complément à deux de -1.

De même:

System.out.println(Integer.toBinaryString(~1));
// prints "11111111111111111111111111111110"

C'est-à-dire, pour un int non signé 32 bits dans la représentation du complément à deux, ~1 == -2.


Lectures complémentaires:

68
polygenelubricants

Ce que vous dites réellement est ~ 0x00000000 et cela donne 0xFFFFFFFF. Pour un int (signé) en Java, cela signifie -1.

13
LaZe

Vous pouvez imaginer que le premier bit d’un numéro signé soit - (2x -1) où x est le nombre de bits.

Donc, pour un nombre de 8 bits, la valeur de chaque bit (dans l’ordre de gauche à droite) est:

-128 64 32 16 8 4 2 1

Maintenant, en binaire, 0 est évidemment tous les 0:

    -128 64 32 16 8 4 2 1
0      0  0  0  0 0 0 0 0 = 0

Et quand vous faites le pas au pas ~, chacun de ces 0 devient un 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

Ceci est également utile pour comprendre le débordement:

     -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

~ est un opérateur au niveau des bits.

~0 = 1 which is -1 in 2's complement form  

http://en.wikipedia.org/wiki/Two's_complement

Quelques nombres sous forme de complément à deux et leur nombre au pas ~ (juste en dessous d'eux):

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

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

7
N 1.1

Comme ~ n’est pas une inversion binaire, c’est une inversion au niveau du bit. L'inversion binaire serait ! et ne peut (en Java) être appliquée qu'aux valeurs booléennes.

3
Bombe

Dans le codage binaire standard, 0 est un zéro, ~ est un bit NON. Tous les 1 est (le plus souvent) -1 pour les types entiers signés. Donc pour un type d'octet signé:

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

C'est l'inversion binaire, et dans le deuxième complément, -1 est l'inversion binaire de 0.

0
Daniel Fath

0 ici n'est pas un peu. C'est un octet (au moins; ou plus) - 00000000. En utilisant un bit ou on aura 11111111. C'est -1 comme entier signé ...

0
kpower

Pour un entier signé 32 bits

~00000000000000000000000000000000=11111111111111111111111111111111 (qui est -1)

0
YOU

Je pense que la vraie raison est que ~ est le complément de Two.

Javascript désigne le caractère tilde, ~, pour le complément à deux, même si dans la plupart des langages de programmation, le tilde représente une bascule pour le complément à un.

0
Nacho