2010-03-24 13 views
5

mam kod działa, że ​​czasami daje to:C#: przesunięcie w lewo przypisanie zachowanie operatora

UInt32 current; 
int left, right; 

... 

//sometimes left == right and no shift occurs 
current <<= (32 + left - right); 

//this works 
current <<= (32 - right); 
current <<= left; 

Wydaje się, dla każdej wartości> = 32% tylko wartość 32 jest przesunięty. Czy w strukturze występuje "optymalizacja"?

+1

Problem jest niejasny. 'UInt32' ma 32 bity wartości. Jeśli przesuniesz go w lewo o 32 bity, otrzymasz wszystkie bity od zera (ponieważ przesunąłeś wszystkie bity wartości "z dala"). Jeśli przejdziesz dalej, nadal otrzymasz wszystkie bity zero, więc efekt jest dokładnie taki sam. Czego oczekiwałeś? –

+0

To nie jest optymalizacja; tak właśnie zdefiniowano działanie operatora. – Gabe

Odpowiedz

6

C# 3.0 specyfikacji języka, 7.8 "operatorzy zmiana":

Dla predefiniowanych operatorów, liczba bitów Shift jest obliczana w następujący sposób:

  • Gdy typ x jest int lub uint, liczba zmian jest podana przez niskie liczby pięciu bitów liczby. Innymi słowy, liczba zmian jest obliczana z liczby & 0x1F.
  • Gdy typ x jest długi lub ulong, liczba przesunięć jest podana przez sześć bitów liczby mniejszej rzędu. Innymi słowy, liczba zmian jest obliczana z liczby & 0x3F.