1
votes

Comment le bitwise not operation donne-t-il une valeur négative

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?


0 commentaires

3 Réponses :


2
votes

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.


1 commentaires

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.



3
votes

(x décale les bits de un, donc

11111111 11111111 11111111 11111101

deviendra:

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


4 commentaires

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.



2
votes

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.


0 commentaires