212 votes

Comment fonctionne l’opérateur de complément de bits (~) ?

Comment se fait-il que 2 ~ est -3 ?

321voto

Anthony Points 3706

Rappelez-vous que les chiffres sont stockés en complément à deux. Comme un exemple, voici la représentation de -2 en complément à deux: (8 bits)

1111 1110

La façon dont vous obtenez c'est en prenant la représentation binaire d'un nombre, le prendre en complément (en inversant tous les bits) et d'en ajouter un. Deux départs 0000 0010, et en inversant les bits de nous obtenir 1111 1101. L'ajout d'un nous obtient le résultat ci-dessus. Le premier bit est le bit de signe, ce qui implique un négatif.

Donc, nous allons jeter un oeil à la façon dont nous obtenons ~2 = -3:

Voici deux de nouveau:

0000 0010

Simplement retourner les bits et on obtient:

1111 1101

Eh bien, quoi de -3 ressembler en complément à deux? Commencez avec positive 3: 0000 0011, inverser tous les bits à 1111 1100, et en ajouter un, 1111 1101.

Donc, si vous tout simplement inverser les bits 2, vous obtenez le complément à deux de la représentation de -3.

L'opérateur de complément (~) RETOURNE BITS. C'est à la machine à l'interprétation de ces bits.

44voto

driis Points 70872

~ retourne les bits de la valeur.

Pourquoi 2 ~ est -3 a à voir avec la façon dont les nombres sont représentés au niveau du bit. Les nombres sont représentés comme complément à deux.

Ainsi, 2 est la valeur binaire

Et ~ 2 renverse les bits donc la valeur est maintenant :

Qui est la représentation binaire de -3.

21voto

Motti Points 32921

Comme d'autres l'ont mentionné ~ juste retourné bits (les changements de l'un à zéro et zéro ou un) et depuis en complément à deux est utilisé, vous obtenez le résultat que vous avez vu.

Une chose à ajouter, c'est pourquoi en complément à deux est utilisé, c'est ainsi que les opérations sur les nombres négatifs seront les mêmes que sur des nombres positifs. Pensez -3 que le nombre d' 3 doit être ajoutée afin d'obtenir de zéro et vous verrez que ce nombre est 1101, rappelez-vous que l'ajout binaire est comme à l'école primaire (décimal) plus seulement de vous les porter quand vous arrivez à deux plutôt que 10.

 1101 +
 0011 // 3
    =
10000
    =
 0000 // lose carry bit because integers have a constant number of bits.

Par conséquent, 1101 est -3, retourner les morceaux que vous obtenez 0010 , qui est de deux.

9voto

gbarry Points 3813

Cette opération est un complément, pas une négation.

Considérons que ~ 0 =-1 et le travail de là.

L’algorithme pour la négation est, « compléter, incrémenter ».

Saviez-vous que ? Il y a aussi « un complément » où les nombres inverses sont symétriques et il a les deux 0 et - 0.

8voto

Himanshu Aggarwal Points 352

Je sais que la réponse à cette question est publié un long retour, mais je voulais partager ma réponse pour la même chose.

Pour trouver le complément d'un nombre, d'abord trouver son équivalent binaire. Ici, nombre à virgule 2 est représenté comme 0000 0010 sous forme binaire. Maintenant, de prendre son complément par inversion (retournement toutes les 1 en 0 et 0 à 1) tous les chiffres de sa représentation binaire, ce qui aura pour résultat:

0000 0010 → 1111 1101

C'est le complément du nombre décimal 2. Et depuis le premier bit, c'est à dire, le bit de signe est à 1 dans le nombre binaire, cela signifie que le signe est négatif pour le numéro enregistré. (ici, le nombre visé est pas 2 mais le complément de 2).

Maintenant, puisque les nombres sont stockés en tant que complément de 2 (en prenant le complément d'un nombre plus un), de sorte à afficher ce nombre binaire, 1111 1101, en décimal, nous avons d'abord besoin de trouver son complément de 2, qui sera:

1111 1101 → 0000 0010 + 1 → 0000 0011

C'est le complément de 2. La représentation décimale du nombre binaire, 0000 0011, 3. Et, depuis, le bit de signe est un comme mentionné ci-dessus, de sorte que le montant de réponse est - -3.

Astuce: Si vous lisez cette procédure à suivre, alors vous avez observé que le résultat pour le complément de l'opérateur est en fait, le nombre (opérande - sur laquelle cet opérateur est appliqué) et une avec un signe négatif. Vous pouvez essayer avec d'autres numéros de trop.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X