Operatore << (Riferimenti per C#)
L'operatore di spostamento a sinistra (<<) sposta il primo operando verso sinistra in base al numero di bit specificati nel secondo operando. Il tipo del secondo operando deve essere un int o un tipo avente una conversione numerica implicita predefinita su int.
Note
Se il primo operando è un tipo int o uint (quantità a 32 bit), il conteggio dello spostamento sarà dato dai cinque bit meno significativi del secondo operando. Ovvero, il calcolo shift effettivo è compreso tra 0 e 31 bit.
Se il primo operando è un tipo long o ulong (quantità a 64 bit), il conteggio dello spostamento sarà dato dai sei bit meno significativi del secondo operando. Ovvero, il calcolo shift effettivo è compreso tra 0 e 63 bit.
Tutti i bit più significativi che non rientrano nell'intervallo del tipo del primo operando dopo lo spostamento vengono scartati, mentre i bit vuoti meno significativi vengono riempiti di zeri. Le operazioni di spostamento non provocano mai overflow.
I tipi definiti dall'utente possono sottoporre a overload l'operatore << (per ulteriori informazioni, vedere operator). Il tipo del primo operando deve essere un tipo definito dall'utente, mentre il tipo del secondo operando deve essere int. Quando si esegue l'overload di un operatore binario, viene eseguito in modo implicito anche l'overload dell'eventuale operatore di assegnazione corrispondente.
Esempio
class MainClass11
{
static void Main()
{
int i = 1;
long lg = 1;
// Shift i one bit to the left. The result is 2.
Console.WriteLine("0x{0:x}", i << 1);
// In binary, 33 is 100001. Because the value of the five low-order
// bits is 1, the result of the shift is again 2.
Console.WriteLine("0x{0:x}", i << 33);
// Because the type of lg is long, the shift is the value of the six
// low-order bits. In this example, the shift is 33, and the value of
// lg is shifted 33 bits to the left.
// In binary: 10 0000 0000 0000 0000 0000 0000 0000 0000
// In hexadecimal: 2 0 0 0 0 0 0 0 0
Console.WriteLine("0x{0:x}", lg << 33);
}
}
/*
Output:
0x2
0x2
0x200000000
*/
Commenti
Si noti che i<<1 e i<<33 generano lo stesso risultato, in quanto 1 e 33 hanno gli stessi cinque bit meno significativi.