5

我正在运行有时会产生以下代码的代码:

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 被移动。框架中是否发生了一些“优化”?

4

1 回答 1

6

C# 3.0 语言规范,7.8“移位运算符”:

对于预定义的运算符,要移位的位数计算如下:

  • 当 x 的类型为 int 或 uint 时,移位计数由 count 的低五位给出。换句话说,移位计数是从 count & 0x1F 计算出来的。
  • 当 x 的类型为 long 或 ulong 时,移位计数由 count 的低六位给出。换句话说,移位计数是从 count & 0x3F 计算出来的。
于 2010-03-24T05:40:30.580 回答