Pourquoi l'opération au niveau du bit (~0);
imprime -1? En binaire, non 0 doit être 1. Pourquoi ?bitwise pas opérateur
Répondre
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:
- Two's complement
- Ce système est utilisé par Java (entre autres) pour représenter signé valeur numérique en bits
- JLS 15.15.5 Bitwise complement operator
~
- « noter que, dans tous les cas,
~x
égal(-x)-1
»
- « noter que, dans tous les cas,
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.
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
Il est inversion binaire, et en second complément -1 est une inversion binaire de 0.
Ce que vous dites est en fait ~ 0x00000000 et que les résultats en 0xFFFFFFFF. Pour un (signé) int en java, cela signifie -1.
~
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 = -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 1 = 127
+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 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é ...
32 bits entier signé
~00000000000000000000000000000000=11111111111111111111111111111111
(qui est - 1)
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!
Plus d'exemples clairs, merci! –
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.
Si vous voulez retourner un seul bit, utilisez 'x^1'. – kennytm
Ce n'est pas un opérateur 'non'. C'est un opérateur 'complément'. – EJP
@EJP: Un *** *** opérateur de complément de ***. – kennytm