2010-03-24 8 views
5

Я бегу код, который иногда приводит к следующим образом:C#: Сдвиг влево присваивание поведение оператора

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

Проблема неясна. 'UInt32' имеет 32 бита значения. Если вы сдвинете его налево на 32 бита, вы получите все биты нуль (потому что вы сдвинули все биты значений «прочь»). Если вы переместитесь больше, вы все равно получите все биты нуль, так что эффект будет точно таким же. Чего ты ожидал? –

+0

Это не оптимизация; это то, как оператор определен для работы. – Gabe

ответ

6

C# 3.0 Язык спецификаций, 7.8 "Shift операторы":

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

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