Opérateurs de postes en bits sur Types signés

j'essaie de comprendre le comportement des opérateurs bitwise sur les types signés et non signés. Conformément au document ISO/CEI, voici ce que je comprends.

opérateur de poste de gauche

  • Le résultat de E1 << E2 , est E1 gauche décalée E2 positions de bits

  • les bits libérés à cause du décalage de gauche seront remplis de zéros.

  • E1 signé non négatif: E1 << E2 résultera en E1 multiplié par 2 puissance de E2, si la valeur est représentative par le type de résultat.

  • Q1: Qu'en est-il des négatifs signés?

  • Q2: Je ne suis pas capable de comprendre ce que signifie" modulo réduit " dans le contexte suivant. "Si E1 a un type non signé, la valeur de le résultat est E1 × 2E2 , modulo réduit un de plus que la valeur maximale représentable dans le type de résultat" .

Opérateur De Poste De Droite

  • le résultat de E1 >> E2 est une position de bits E2 décalée vers la droite.

  • E1 signé non-négatif/unsigned :La valeur du résultat est la partie entière du quotient de E1 / 2E2

  • Q3: pour les entiers négatifs signés, je vois, certains livres définissant que les postes vacants seront remplis avec 1 .Veuillez donner plus de détails sur l'utilisation de l'opérateur de décalage à droite sur signé négatif int.

7
demandé sur Vivek Maran 2012-11-24 23:01:04

4 réponses

Q1: le comportement de l'opérateur de décalage de gauche sur les valeurs négatives des types entiers signés n'est pas défini, de même que le comportement pour les valeurs positives des types entiers signés lorsque le résultat E1 * 2^E2 n'est pas représentatif du type.

qui est explicitement mentionné à la section 6.5.7, paragraphes 4 et 5 de la norme (projet n1570):

4 le résultat de E1 << E2 est E1 bit décalé vers la gauche E2 positions; les bits libérés sont remplis de zéros. Si E1 a un type non signé, la valeur du résultat est E1 × 2^E2 , réduit modulo un de plus que la valeur maximale représentée dans le type de résultat. Si E1 a un type signé et une valeur non négative, et E1 × 2^E2 est représentable dans le type de résultat, alors c'est la valeur résultante; sinon, le comportement est indéfini.

Q2: le module de réduction plus que la valeur maximale représentée dans le type entier non signé signifie que les bits qui sont déplacés sur la gauche sont simplement écartés.

mathématiquement, si la valeur maximale du type non signé est 2^n - 1 (et il est toujours de cette forme), le résultat du déplacement E1 laissé par E2 bits est la valeur V dans la gamme de 0 à 2^n - 1 tel que la différence

(E1 * 2^E2 - V)

est divisible par 2^n , c'est-à-dire, c'est le reste que vous obtenez en divisant E1 * 2^E2 par 2^n .

Q3: le comportement lors du déplacement des valeurs négatives à droite des types entiers signés est défini par la mise en œuvre. Le comportement le plus courant (au moins sur les machines de complément de two) est un déplacement arithmétique, c'est-à-dire le résultat est le quotient arrondi vers le bas (vers l'infini négatif).

5 le résultat de E1 >> E2 est E1 position des bits E2 décalés vers la droite. Si E1 a un type non signé ou si E1 a un type signé et une valeur non négative, la valeur du résultat est la partie intégrante du quotient de E1 / 2^E2 . si E1 a un type signé et une valeur négative, la valeur résultante est définie par la mise en œuvre.

8
répondu Daniel Fischer 2012-11-24 19:17:22
  • Re: Q1

    Si E1 est négatif, le comportement n'est pas défini.

  • Re: T2

    L'arithmétique non signée est "cyclique", c'est-à-dire, il enroule autour de sorte que UINT_MAX + 1 est 0 encore une fois. C'est comme si chaque calcul était fait modulo UINT_MAX+1. Une autre façon de penser à ce sujet est que les morceaux excédentaires qui ne rentrent pas dans sur la gauche sont tout simplement lâchés.

  • Re: T3

    Si E1 est négatif, le résultat est défini par la mise en œuvre. C'est, cela dépend de votre machine/compilateur/options, mais le comportement doit être documentée ("défini") quelque part, en général le compilateur manuel. Deux choix populaires sont de remplir les bits entrants sur la gauche avec 1 (déplacement arithmétique) ou avec 0 (déplacement logique).

5
répondu melpomene 2012-11-24 19:10:37

si vous voulez vraiment comprendre les opérateurs de changement bitwise. Regardez ces règles simples:

1) dans le décalage de gauche, E1 << E2, tous les bits vacants sur le côté droit seront remplis de zéros, peu importe si le nombre est signé ou non, toujours des zéros seront déplacés.

2) en déplacement de gauche, E1 >> E2, tous les bits vacants sur le côté gauche, seront 0 si le nombre est positif, et seront 1 si le nombre est négatif.Gardez à l'esprit qu'un unsigned nombre n'est jamais négatif. En outre, certaines implémentations peuvent aussi les remplir avec 0 sur certaines machines même si le nombre est négatif, alors ne vous fiez jamais à cela.

tous les autres scénarios pourraient s'expliquer par ces deux règles simples. Maintenant , si vous voulez connaître la valeur du résultat après le déplacement, il suffit d'écrire la représentation du nombre de bits et de se déplacer manuellement sur le papier et d'entrer des bits aux espaces libres en utilisant ces deux règles. Vous pourriez alors mieux comprendre comment fonctionne le bit shifting.

For example lets take int i = 7;
i<<2
now i = 0000 0000 0000 0000 0000 0000 0000 0111
perform two left shits according to rule 1 would be:

0000 0000 0000 0000 0000 0000 0001 1100

qui lui donnera une valeur de 28 ( E1 * 2E2 = 7 *2*2 = 28), qui est la même que représentée par le motif bit.

maintenant laissez-moi vous expliquer la chose "modulo réduit", Eh bien si vous déplacez un grand nombre, que les bits du côté gauche seront perdus, "modulo réduit" compense pour cela, donc si votre valeur résultante si plus grande que la valeur maximale que le type de données pourrait contenir, les bits à gauche seront perdus , et puis: résultat = (E1 * 2*E2) % (maximumValue + 1).

pour divers autres cas, il suffit de garder les règles ci-dessus à l'esprit , et vous êtes bon:)

2
répondu Jagdeep Sidhu 2012-11-24 19:28:44

Q2:" valeur réduite modulo X "signifie" valeur mod X "en mathématiques et peut être écrit comme" valeur % X " en C. Cette partie explique simplement comment les dépassements d'entiers fonctionnent.

1
répondu David Grayson 2012-11-24 19:10:48