Je veux voir comment PAS fonctionne au niveau du bit à travers un exemple simple:
int x = 4; int y; int z; y = ~(x<<1); z =~(0x01<<1); cout<<"y = "<<y<<endl; cout<<"z = "<<z<<endl;
Cela donne y = -9
et z = -3 . Je ne vois pas comment cela se produit. N'importe qui peut m'éduquer un peu?
3 Réponses :
Si un entier est positif ou négatif (le signe de l'entier) est stocké dans un bit dédié, le bit de signe . Le NOT au niveau du bit affecte également ce bit, donc tout nombre positif devient un nombre négatif et vice versa.
" complément à deux "représentation, où le bit de signe affecte également la magnitude. Par exemple, l'entier signé 8 bits 00000000
serait 0, mais 10000000
(bit de signe inversé) serait -128.
Soyez prudent avec la façon dont vous avez formulé cela. Il s'avère que le bit de poids fort indique le signe, mais la façon dont vous l'avez formulé le fait sonner comme une magnitude signée plutôt que comme un complément à 2.
deviendra: (x décale les bits de un, donc
11111111 11111111 11111111 11111101
00000000 00000000 00000000 00000010
Quelle est la représentation de 8
. Alors ~
inversera tous les bits de telle sorte qu'il devienne:
00000000 00000000 00000000 00000001
Quelle est la représentation de -9
.
0x01
est
11111111 11111111 11111111 11110111
en binaire, donc lorsqu'il est décalé une fois devient:
00000000 00000000 00000000 00001000
Et puis quand ~
est appliqué, nous obtenons:
00000000 00000000 00000000 00000100
Qui est -3
dans binaire
Merci pour votre réponse! Comment une représentation aussi longue équivaut à un nombre négatif. Je pensais que la formule de conversion du binaire en décimal était basée sur la somme de 2 ^ x. Veuillez me corriger si je me suis trompé.
@jingweimo Le bit le plus significatif (le premier bit) détermine s'il est positif ou négatif. Si le premier bit est 1, alors il est négatif, et s'il vaut 0, il est positif
Les nombres négatifs sont généralement représentés en utilisant complément à deux au lieu de sign-magnitude, où vous prenez le PAS au niveau du bit de la version positive du nombre et ajoutez-y un. Ainsi, les nombres négatifs avec une petite magnitude sont représentés par un groupe de 1.
Le schéma de la somme de 2 ^ x ne s'applique qu'aux nombres positifs. Pour les nombres négatifs, la convention actuelle consiste à ajouter effectivement 2 ^ N (où N est le nombre de bits dans le nombre comprenant le signe, par exemple N = 32 pour les entiers de 32 bits) pour traduire la valeur négative dans la plage positive (haute) , et seulement ensuite appliquer le schéma de la somme de 2 ^ x. La plage utilisée pour les nombres positifs et négatifs est choisie de sorte que si le bit 2 ^ (N-1) est défini, il représente un nombre négatif.
Eh bien, il y a une très longue histoire derrière.
Pour faciliter la compréhension, utilisons des nombres binaires.
x = 4
ou x = 0b 0000 0000 0000 0000 0000 0000 0000 0100
car sizeOf (int) = 4
après x << 1
x = 0b 0000 0000 0000 0000 0000 0000 0000 1000
et après
~ (x << 1)
x = 0b 1111 1111 1111 1111 1111 1111 1111 0111
.
et ici commence la complication. Puisque int
est un type signé, cela signifie que le premier bit est un signe et que tout le système est Deux complemnt .
donc x = 0b 1111 1111 1111 1111 1111 1111 1111 0111
est x = -9
et par exemple
x = 0b 1111 1111 1111 1111 1111 1111 1111 1111
est x = -1
et x = 0b 0000 0000 0000 0000 0000 0000 0000 0010
est 2
En savoir plus sur Two complemnt.