2010-03-25 9 views
34

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

+7

Si vous voulez retourner un seul bit, utilisez 'x^1'. – kennytm

+1

Ce n'est pas un opérateur 'non'. C'est un opérateur 'complément'. – EJP

+1

@EJP: Un *** *** opérateur de complément de ***. – kennytm

Répondre

64

Vous êtes réellement assez proche.

En binaire, pas 0 doit être 1

Oui, cela est tout à fait correct quand nous parlons un peu. Cependant, un int dont la valeur est 0 est en fait 32 bits de tous les zéros! ~ inverse tous les 32 zéros à 32 uns.

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

Ce sont les deux la représentation du complément de -1.

De même:

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

C'est, pour une 32 bits non signé en deux int de la représentation du complément, ~1 == -2.


Pour en savoir plus:

3

Parce que ~ n'est pas une inversion binaire, c'est l'inversion de bit. L'inversion binaire serait ! et ne peut (en Java) être appliquée qu'aux valeurs booléennes.

1

En codage binaire standard, 0 correspond à 0, ~ à NOT bit. 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 
0

Il est inversion binaire, et en second complément -1 est une inversion binaire de 0.

13

Ce que vous dites est en fait ~ 0x00000000 et que les résultats en 0xFFFFFFFF. Pour un (signé) int en java, cela signifie -1.

7

~ est un opérateur au niveau du bit.

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

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

Quelques chiffres dans deux de la forme de complément et leur bit sage de ne pas ~ (juste en dessous d'eux):

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

+0

+1 pour l'exemple clair. Les programmeurs qui aiment le puzzle peuvent découvrir à la fois comment fonctionne et comment le complément de deux fonctionne juste en étudiant soigneusement votre exemple! –

0

0 ici n'est pas un peu. Il est un octet (au moins, ou plus) - 00000000 En utilisant ou nous bitwise avoir 11111111. Il est -1 comme entier signé ...

0

32 bits entier signé

~00000000000000000000000000000000=11111111111111111111111111111111 (qui est - 1)

9

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

Ainsi, étant donné un nombre de 8 bits, la valeur de chaque bit (en commençant par la gauche) est la suivante:

-128 64 32 16 8 4 2 1 

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

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

Et quand vous faites le pas ~ chaque bit de ces 0s devient 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 i n compréhension de 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! 
+0

Plus d'exemples clairs, merci! –

0

Je pense que la vraie raison est que ~ est le complément à deux. Javascript désigne le caractère tilde, ~, pour le complément à deux, même si dans la plupart des langages de programmation tilde représente un peu bascule pour son complément.