web-dev-qa-db-fra.com

La différence entre le décalage logique vers la droite, le décalage arithmétique vers la droite et la rotation vers la droite

J'ai lu le délice du Hacker classique et j'ai du mal à comprendre la différence entre le décalage logique à droite, le décalage arithmétique à droite et la rotation à droite. Veuillez excuser si le doute semble trop simple.

Also why is there no arithmetic shift left?

13
Chandrahas Aroori

Souvenez-vous d'abord que les mots machine sont de taille fixe. Dites 4 et que votre entrée est:

+---+---+---+---+
| a | b | c | d |
+---+---+---+---+

Pousser ensuite tout d'une position vers la gauche donne:

+---+---+---+---+
| b | c | d | X |
+---+---+---+---+

Question quoi mettre comme X?

  1. avec un shift mettre 0
  2. avec rotation put a

Maintenant, Poussez tout une position vers la droite donne:

+---+---+---+---+
| X | a | b | c |
+---+---+---+---+

Question quoi mettre comme X?

  1. avec un décalage logique mettre 0
  2. avec un décalage arithmétique put a
  3. avec rotation put d

Grossièrement.

Décalage logique correspond à la multiplication (décalage à gauche) par 2, (entier à décalage à droite) par 2.

décalage arithmétique est quelque chose lié à la représentation en complément à 2 des nombres signés. Dans cette représentation, le signe est le bit le plus à gauche, puis le décalage arithmétique préserve le signe (c'est ce qu'on appelle l'extension du signe).

Rotation n'a pas de signification mathématique ordinaire et est presque une opération obsolète même dans les ordinateurs.

21

La différence est à peu près expliquée dans la colonne de droite.

  • Le décalage logique traite le nombre comme un groupe de bits et se transforme en zéros. C'est le >> opérateur en C.
  • Le décalage arithmétique traite le nombre comme un entier signé (en complément de 2 s) et "conserve" le bit le plus haut, décalant les zéros si le bit le plus haut était 0 et les uns s'il en était un. L'opérateur de décalage à droite de C a un comportement défini par l'implémentation si le nombre déplacé est négatif.

    Par exemple, le nombre binaire 11100101 (-27 en décimal, en supposant un complément de 2 s), lorsque le décalage à droite de 3 bits à l'aide du décalage logique devient 00011100 (décimal 28). C'est clairement déroutant. En utilisant un décalage arithmétique, le bit de signe serait conservé et le résultat deviendrait 11111100 (décimal -4, ce qui correspond à peu près à -27/8).

  • La rotation ne fait rien non plus, car les bits les plus hauts sont remplacés par les bits les plus bas. C n'a pas d'opérateur pour faire la rotation.

6
unwind