Les opérateurs << et >> sont utilisés pour effectuer des opérations de déplacement de bits.
- shift-expression:
- additive-expression
shift-expression << additive-expression
shift-expression >> additive-expression
Pour une opération de la forme x << count ou x >> count, la résolution de surcharge d'opérateur binaire (Section 7.2.4) est appliquée pour sélectionner l'implémentation d'un opérateur spécifique. Les opérandes sont convertis vers les types de paramètres de l'opérateur sélectionné et le type du résultat correspond au type de retour de l'opérateur.
Lors de la déclaration d'un opérateur de déplacement surchargé, le type du premier opérande doit toujours être une classe ou un struct contenant cette déclaration et le type du deuxième opérande doit toujours être int.
Les opérateurs de déplacement prédéfinis sont indiqués ci-dessous.
- Déplacement à gauche :
int operator <<(int x, int count);
uint operator <<(uint x, int count);
long operator <<(long x, int count);
ulong operator <<(ulong x, int count);
L'opérateur << déplace x vers la gauche du nombre de bits calculé de la manière décrite ci-dessous.
Les bits de poids fort qui se trouvent en dehors de la plage du type du résultat de x sont éliminés, les bits restants sont déplacés vers la gauche et les positions des bits vides de poids faible sont mises à zéro.
- Déplacement à droite :
int operator >>(int x, int count);
uint operator >>(uint x, int count);
long operator >>(long x, int count);
ulong operator >>(ulong x, int count);
L'opérateur >> déplace x vers la droite du nombre de bits calculé de la manière décrite ci-dessous.
Lorsque x est du type int ou long, les bits de poids faible de x sont éliminés, les bits restants sont déplacés vers la droite et les positions des bits de poids fort sont mises à zéro si x n'est pas négatif et mises à un si x est négatif.
Lorsque x est de type uint ou ulong, les bits de poids faible de x sont éliminés, les bits restants sont déplacés vers la droite et les positions des bits vides de poids fort sont mises à zéro.
Le nombre de bits à déplacer pour les opérateurs prédéfinis est calculé de la manière suivante :
- Lorsque le type de
x est int ou uint, le compteur de décalage est fourni par les cinq bits de poids faible de count. En d'autres termes, le compteur de décalage est calculé à partir de count & 0x1F. - Lorsque le type de
x est long ou ulong, le compteur de décalage est donné par les six bits de poids faible de count. En d'autres termes, le compteur de décalage est calculé à partir de count & 0x3F.
Si le compteur de décalage est égal à zéro, l'opérateur de déplacement retourne simplement la valeur de x.
Les opérations de déplacement ne provoquent jamais de surcharge et produisent les mêmes résultats dans des contextes checked et unchecked.
Lorsque l'opérande de gauche de l'opérateur >> est d'un type intégral signé, l'opérateur effectue un déplacement arithmétique à droite au cours duquel la valeur du bit de poids fort (le bit du signe) de l'opérande est amené à la position du bit de poids fort ou à la position vide. Lorsque l'opérande de gauche de l'opérateur >> est d'un type intégral non signé, l'opérateur effectue un déplacement logique vers la droite au cours duquel les positions vides des bits de poids fort sont toujours mises à zéro. Les casts explicites peuvent être utilisés pour réaliser l'opération opposée à celle déduite du type de l'opérande. Par exemple, si x est une variable du type int, l'opération unchecked((int)((uint)x >> y)) effectue un déplacement logique à droite de x.