C #: Сдвиг влево поведение оператора присваивания - PullRequest
5 голосов
/ 24 марта 2010

Я запускаю код, который иногда дает это:

UInt32 current;  
int left, right;  

...

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

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

Появляется для любого значения> = 32, только значение% 32 смещено. Есть ли какая-то "оптимизация", происходящая в рамках?

1 Ответ

6 голосов
/ 24 марта 2010

Спецификация языка C # 3.0, 7.8 "Операторы сдвига":

Для предопределенных операторов число сдвигаемых битов вычисляется следующим образом:

  • Когда тип x имеет тип int или uint, счет сдвига задается младшими пятью битами счета. Другими словами, число сдвигов вычисляется из числа & 0x1F.
  • Когда тип x длинный или ulong, счетчик сдвига задается шестизначными битами младшего разряда. Другими словами, число сдвигов вычисляется из числа & 0x3F.
...