SHR |
Décalage vers la droite |
---|---|
Free Pascal |
Syntaxe
entier SHR decalage |
Paramètres
Nom | Description |
---|---|
entier | Ce paramètre permet d'indiquer une expression de type entier subissant le «décalage de bits vers la droite» |
decalage | Ce paramètre permet d'indiquer le décalage de bit vers la droite à effectuer |
Description
Ce mot réservé permet d'effectuer un décalage de bit vers la droite.
Remarques
- Opération de décalage logique à droite : Le mot-clef SHR en Free Pascal est un opérateur de décalage logique à droite (Shift Right). Il déplace les bits d'une valeur entière vers la droite d'un certain nombre de positions spécifié. Chaque décalage vers la droite divise la valeur par 2, ce qui est utile pour des optimisations de calculs sur les puissances de 2.
- Différence avec SAR (Shift Arithmetic Right) : Contrairement à SAR, conservant le bit de signe pour les entiers signés (opération arithmétique), SHR effectue un décalage logique. Cela signifie que les bits déplacés sont remplacés par des zéros, ce qui peut avoir un impact important lorsqu'on manipule des nombres négatifs en représentation complément à deux.
- Utilisation avec des types non signés et signés : L'opérateur SHR fonctionne correctement avec les types non signés (Byte, Word, Cardinal,...), mais peut produire des résultats inattendus sur les types signés (ShortInt, SmallInt, Integer,...). En effet, un décalage logique à droite sur un entier signé peut entraîner un changement de valeur imprévu en raison de la perte du bit de signe.
- Optimisation des performances : Les opérations SHR sont souvent plus rapides que des divisions classiques, car elles sont directement prises en charge par l'ALU (Arithmetic Logic Unit) des processeurs modernes. Utiliser SHR au lieu d'une division par 2, 4, 8,..., peut améliorer l'efficacité du code dans des calculs intensifs, notamment dans les algorithmes de compression ou de cryptographie.
- Effet sur les bits de poids faible : Lorsqu'on applique SHR à un entier, les bits les plus à droite sont perdus (remplacés par des zéros) et ne sont pas récupérables. Cela signifie qu'un décalage trop important peut rendre la valeur complètement nulle. Par exemple, 8 SHR 3 (soit 1000 en binaire) donne 1, tandis que 8 SHR 4 donne 0.
- Application dans la manipulation de bits : SHR est couramment utilisé en combinaison avec SHL (Shift Left) pour manipuler les bits individuellement, notamment dans le traitement des registres matériels, la gestion des couleurs en programmation graphique et l'implémentation d'algorithmes de hachage. Il permet d'extraire des sous-parties d'un nombre en déplaçant les bits vers la droite et en appliquant un masque (AND).
- Compatibilité avec Turbo Pascal et Delphi : SHR fait partie des opérateurs historiques de Pascal et est compatible avec Turbo Pascal et Delphi. Cela garantit une bonne portabilité du code entre ces environnements. Toutefois, certaines plateformes modernes offrent également des fonctions intrinsèques pour des décalages plus précis, comme SAR et ROL/ROR (rotation des bits).
- Limitation sur le nombre de décalages : Dans Free Pascal, si le nombre de décalages spécifié est supérieur ou égal au nombre de bits du type concerné, le résultat sera toujours zéro. Par exemple, 255 SHR 8 donne 0 pour un Byte car tous les bits ont été supprimés. Cela peut être source de bogues si la valeur du décalage est déterminée dynamiquement sans vérification préalable.
Exemple
Voici un exemple montrant l'utilisation de «SHR», dans Free Pascal, avec des valeurs brutes :
- Program ShrSamples;
-
- BEGIN
- WriteLn('16 SHR 0 = ',16 SHR 0);
- WriteLn('16 SHR 1 = ',16 SHR 1);
- WriteLn('16 SHR 2 = ',16 SHR 2);
- WriteLn('16 SHR 3 = ',16 SHR 3);
- WriteLn('16 SHR 4 = ',16 SHR 4);
- WriteLn('16 SHR 0 = ',32 SHR 0);
- WriteLn('32 SHR 1 = ',32 SHR 1);
- WriteLn('32 SHR 2 = ',32 SHR 2);
- WriteLn('32 SHR 3 = ',32 SHR 3);
- WriteLn('32 SHR 4 = ',32 SHR 4);
- WriteLn('32 SHR 4 = ',32 SHR 4);
- END.
on obtiendra le résultat suivant :
16 SHR 0 = 1616 SHR 1 = 8
16 SHR 2 = 4
16 SHR 3 = 2
16 SHR 4 = 1
16 SHR 0 = 32
32 SHR 1 = 16
32 SHR 2 = 8
32 SHR 3 = 4
32 SHR 4 = 2
32 SHR 4 = 2
Dernière mise à jour : Dimanche, le 28 février 2016