【问题标题】:C#: Shift left assignment operator behaviorC#:左移赋值运算符行为
【发布时间】:2010-03-24 05:28:35
【问题描述】:

我运行的代码有时会产生这样的结果:

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

【问题讨论】:

  • 问题不清楚。 UInt32 有 32 个值位。如果将其左移 32 位,则所有位都将为零(因为您已将所有值位“移开”)。如果你移动更多,你仍然会得到所有位为零,所以效果是完全一样的。你期待什么?
  • 这不是优化;这就是操作符被定义为如何工作的方式。

标签: c# bitwise-operators


【解决方案1】:

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

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

  • 当 x 的类型为 int 或 uint 时,移位计数由 count 的低五位给出。换句话说,移位计数是根据 count & 0x1F 计算得出的。
  • 当 x 的类型为 long 或 ulong 时,移位计数由 count 的低六位给出。换句话说,移位计数是根据 count & 0x3F 计算得出的。

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 2019-02-05
    • 2015-12-13
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2011-07-29
    相关资源
    最近更新 更多