J'ai appris à propos des opérations bitwises aujourd'hui et j'ai appris que non pas (~) inverse tous les bits, par exemple: ce qui signifie ~ 10 devrait être -5 mais j'ai vu que C'est -11 (par la ligne de commande Python) qui est p> Seulement deux des bits ont été inversés. Quelqu'un peut-il expliquer pourquoi ce n'est pas 10101? P> Edit: Après avoir regardé ma calculatrice, je le comprends un peu mieux, mais mon propre code de détermination du binaire et de l'INT est toujours confus. Entrer dans (en mode d'octet) 11110101 me donne -11 mais la même chose entrée dans mon code donne -117: p> peut expliquer cela? P> < / p>
3 Réponses :
dans le complément de deux, -11 est Pour nier le numéro de complément d'un deux , vous inverser toutes les bits et ajouter une: p> 11011 code> est pas em> -11. Vous avez un malentendu du schéma de codage pour les nombres négatifs.
10101 code> qui est l'inverversion de bits correcte. P>
Au moins, dans un système 5 bits.
Si vous avez plus de bits, vous slez simplement étendre (préfixe avec un bits à gauche). J'ai utilisé 5 bits parce que la question a montré 5 bits. Cependant, c'est exactement le même processus, peu importe la largeur.
Nous sommes tous en accord ici, bien sûr, mais je dis simplement que le nombre de bits est important, car le bit le plus élevé est le pit-signal. Dans votre exemple, vous utilisez le 4ème bit de droite comme un bit de signalisation, mais cela ne fonctionne pas comme ça dans le monde réel. Vous ne pouvez pas choisir le nombre de bits que vous souhaitez dans un numéro, car le système a fait le choix pour vous et vous n'avez pas de dire dans cela. Vous ne pouvez pas décider que le 4ème bit de la droite est le pit-signal.
Alors, pourquoi doivent-ils utiliser le système Twos Complement au lieu de réserver premier bit pour le signe (comme en C ++ non signé et signé INTS) car 10101 (ou -0b101 en tant que type bin) est -5? Juste déroutant lol
@ J_mie6 dans le système de complément des deux, le bit le plus significatif fait i> indique le signe du nombre. Si le bit est défini, le nombre est négatif. Sinon, alors c'est zéro ou positif. Les avantages du complément de 2 sur le système de bits signés sont nombreux, que vous pouvez rechercher vous-même. Un tel avantage est que le nombre 0 n'a qu'une seule représentation (par opposition à 0b000 = 0 et -0b000 = -0 = 0 dans le système de bits signé.
En outre, la norme C ++ ne spécifie pas i> un système de représentation des INT signé, mais de la pratique de la pratique, des compilateurs do b> utilisent 2s complément sur le matériel typique, car le matériel est spécialement conçu pour cela. .
@Mrlister: à Python, le nombre de bits n'est pas important, car il n'y a pas de nombre défini de bits. Conceptuellement, un nombre négatif contient un nombre infini de bits code> 1 code> à gauche; Les entiers python ne débordent jamais et n'utilisent jamais autant de bits qu'ils ont besoin, de sorte qu'il n'a pas de sens de parler du nombre de bits dans un nombre négatif.
@Karl, la norme C ++ spécifie effectivement les codages signés. C ++ 11 3.9.1 Types fondamentales / 7 Code>: "... Cette norme internationale permet un complément de 2 de 2 représentations de la magnitude signée et de la magnitude signée pour des types intégrés". Tout comme C.
En supposant que les valeurs sont de 32 bits, 10 est et si vous inversez tous ces bits, vous obtenez P> 11111111111111111111111111110101
toujours confus parce que 1111111111111111111111111110101 In int forme est -2147483637?
Drôle, ma calculatrice dit 4294967285.
BinaryToint ("11111111111111111111111111110101", True) = 4294967285L. Là où true représente non signé la mise en place de faux (signée) donne le numéro que j'ai publié.
Conceptuellement, un nombre négatif dans la représentation du complément 2S a un nombre arbitraire de 1 code> S sur la gauche. Vous devez savoir combien d'entre elles sont utilisées afin de convertir le nombre. Python définit
~ code> de sorte que le nombre de bits utilisait pour représenter le résultat est égal au nombre minimal de bits qui seraient nécessaires pour représenter l'entrée. L'effet net de cela, cependant, est que
~ x code> ==
-x - 1 code>, en général.
@Karl Knechtel serait-il jamais utile d'avoir ~ redéfini pour renvoyer le nombre inversé que j'attendrais?
@ J_mie6 Qu'est-ce que faire i> vous attendez? Votre exemple dans votre question s'est avéré un malentendu dans la manière dont les nombres négatifs sont représentés, non pas dans la façon dont les "bits qui se retournent" fonctionne.
@Mrlister dans un didacticiel C ++ où je l'ai d'abord trouvé sur les opérateurs, le ~ opérateur renvoyait différents nombres à l'original, c'est-à-dire ~ 4 (int 4) devient 11 et 4 (int8) devient 251
La chose est, il n'y a pas de 'int 4' ou 'intt8' ou "inanything" en python. C'est comme, une partie de la raison de l'utiliser :)
10101 est -11, car en binaire, -x = ~ x + 1. p>
so ~ x = -x - 1 = - (x + 1). P>
@Mrlister: Vous devriez poster cela comme une réponse.