pas opérateur au niveau du bit
-
22-09-2019 - |
Question
Pourquoi imprime (~0);
opération -1 bit? En binaire, pas 0 doit être 1. pourquoi?
La solution
Vous êtes en fait assez proche.
En binaire, pas 0 doit être 1
Oui, cela est tout à fait correct quand nous parlons un peu.
Cependant, une int
dont la valeur est 0 est en fait 32 bits de zéros! ~
les 32 intervertit zéros 32 autres.
System.out.println(Integer.toBinaryString(~0));
// prints "11111111111111111111111111111111"
Ceci est 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 int
non signé en deux de la représentation du complément, ~1 == -2
.
Pour en savoir plus:
- complément Deux
- Ceci est le système utilisé par Java (entre autres) pour représenter la valeur numérique signée en bits
- JLS 15.15.5 Bitwise opérateur complément
~
- "noter que, dans tous les cas,
~x
égale(-x)-1
"
- "noter que, dans tous les cas,
Autres conseils
Ce que vous dites est en fait ~ 0x00000000 et que les résultats en 0xFFFFFFFF. Pour un (signé) int en java, cela signifie -1.
Vous pouvez imaginer le premier bit dans un nombre signé pour être - (2 x -1 ) où x est le nombre de bits
.Ainsi, étant donné un nombre de 8 bits, la valeur de chaque bit (à gauche à droite ordre) 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 dans le trop-plein de compréhension:
-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 binaire.
~0 = 1 which is -1 in 2's complement form
http://en.wikipedia.org/wiki/Two's_complement
Quelques chiffres en deux 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
Parce que ~
n'est pas inversion binaire, il est l'inversion de bits. inversion binaire serait !
et peut (en Java) Ne doit être appliqué aux valeurs booléennes.
Dans le codage binaire standard, 0 est tout 0s, ~
est pas au niveau du bit. Tous 1s 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 l'inversion binaire de 0.
0 est ici un peu. Il est un octet (au moins, ou plus) - 00000000 En utilisant ou nous bitwise avoir 11111111. Il est -1 en entier signé ...
Pour 32 bits entier signé
~00000000000000000000000000000000=11111111111111111111111111111111
(qui est -1)
Je pense que la vraie raison est que ~ est le complément à deux.
Javascript désigne le tilde de caractère, ~, pour le complément à deux, même si tilde représente dans la plupart des langages de programmation d'une bascule de bit pour le complément de celui-là.