Pourquoi l'opération au niveau du bit (~0);
imprime -1? En binaire, pas 0 devrait être 1. Pourquoi ?
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:
~
~x
est égal à (-x)-1
"Ce que vous dites réellement est ~ 0x00000000 et cela donne 0xFFFFFFFF. Pour un int (signé) en Java, cela signifie -1.
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!
~
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 = −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 1 = 127
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.
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
C'est l'inversion binaire, et dans le deuxième complément, -1 est l'inversion binaire de 0.
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é ...
Pour un entier signé 32 bits
~00000000000000000000000000000000=11111111111111111111111111111111
(qui est -1)
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.