L'Opérateur bit à bit sur les nombres positifs et négatifs
-5 / 2 = -2
-5 >> 1 = -3
J'ai appris de mon professeur que >>1 divise le nombre par 2. Il fonctionne sur un nombre positif, mais il ne fonctionne pas sur les nombres négatifs. Quelqu'un peut m'expliquer??
Grâce
- Il est dépendant de l'implémentation. Mais il y a généralement des tours vers le bas (vers l'infini négatif).
- est-ce un double possible de opérateur de Décalage en C ?
- Tout dépend de la façon dont le nombre est représenté en binaire, jamais entendu parler de Complément à Deux? Il pourrait être comme ça. en.wikipedia.org/wiki/Two's_complement
- L'opérateur de décalage déplace tous les bits d'une façon ou de l'autre, parce que la représentation binaire est la base de 2, chaque bit représente un successives puissance de 2.
- votre professeur vous dit bonne chose.Mais vous l'interpréter. Nouveau venu de la compréhension juste aller pour peu sage opération simplement.
Vous devez vous connecter pour publier un commentaire.
Comme BЈовић & états mystiques, en utilisant des opérateurs de décalage de bits sur les nombres négatifs est définie par l'implémentation.
La raison pour cela est le C ne fait pas la distinction entre logique et de l'arithmétique décalage de bits.
(L'arithmétique des plaquettes avec le bit le plus significatif, logique plaquettes avec des 0)
pour les nombres positifs, ce n'est pas grave, pour à la fois arithmétique et logique bit changements permettraient de garder le bit le plus significatif qu'un 0:
Arithmétique 5>>1
0000 0000 0000 0101
= 5pour
0000 0000 0000 0010
= 2Logique 5>>1
0000 0000 0000 0101
= 5pour
0000 0000 0000 0010
= 2cependant, avec un nombre négatif (2 comp)
L'arithmétique -5>>1
1111 1111 1111 1011
= -5pour
1111 1111 1111 1101
= -3Logique -5>>1
1111 1111 1111 1011
= -5pour
0111 1111 1111 1101
= 32,765ou au moins, ce est la façon dont je le comprends
1111 1111 1111 1101
est -3, pas -2. Le résultat que vous obtenez dans la question d'origine est la moyenne de décalage de bits. La Logique de décalage de bits est la raison pour laquelle vous ne devriez pas utiliser la >> de décalage de bits sur les nombres négatifs. mon post a été édité pour corriger l'erreurUtilisant l'opérateur de décalage sur les nombres entiers est définie par l'implémentation.
[expr.maj]/3 dit ceci :
The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.
est la partie concernant la maj de droite.Tout d'abord,
5 en binaire 0000 0000 0000 0101
mais qu'-5 ? Ici, il est :
Maintenant, nous obtenons: -5= 1111 1111 1111 1011 ( c'est dans 2 forme de complément)
Donc, ici, est de savoir comment calculer -5>>1 :
Puis, nous avons 1111 1111 1111 1101 ( il est encore dans 2 forme de complément)
nous obtenons donc 1000 0000 0000 0011 = -3
Il ne divise pas le nombre entier par deux, mais qu'il effectue (selon la valeur)
un logique ou un décalage par un bit vers la droite. Il arrive à être égale à une division par deux, dans certaines circonstances.
Il fonctionne dans les deux cas, mais le comportement exact n'est pas prescrite par la norme, mais plutôt de la mise en œuvre définies. Habituellement, il divise par deux et tronque le résultat vers l'infini négatif, contrairement à l'objectif de zéro comme une répartition normale ferait.
Pour référence:
Je pense que la réponse est correcte. Que " /" (division) de l'opérateur de générer quotient (résultat de la division).
À votre problème :
Donc c'est ok avec à la fois positif et négatif.
Nombre positif:
Donc, il est très bien avec Nombre positif.
NOTE
Reste jamais être un nombre négatif. C'est toujours un Nombre positif.
Je suppose que la réponse à -5>>1 = -3.
Dans le cas d'un nombre positif, disons 5, la division par 2 donne de 2,5 arrondi au plus proche le plus petit entier c'est à dire 2
Mais quand nous considérons un nombre négatif, -5, la division par 2 donne -2.5. Son arrondi à l'entier le plus proche donne -3.
Dans c le décalage à droite de l'opérateur conserve le bit de signe.d'où le droit de décalage de bits à la préservation de la bit de signe encore les rendements d'un nombre négatif,qui est à deux compléments de forme.