C#二进制移位自动旋转

F.P*_*F.P 4 c# bit-manipulation rotation

我搜索了在C#中进行二进制旋转移位的方法,并得到了很好的答案,如/sf/answers/56842761//sf/answers/2462071/

我想为这个场景创建一个测试用例,其中一个非旋转的移位将作为一个负面测试,但后来我偶然发现这个事实:

public static void Main()
{
    Debug.WriteLine("1<<31 = " + Convert.ToString(1 << 31, 2).PadLeft(32, '0'));
    Debug.WriteLine("1<<32 = " + Convert.ToString(1 << 32, 2).PadLeft(32, '0'));
}
Run Code Online (Sandbox Code Playgroud)

提供以下输出:

1<<31 = 10000000000000000000000000000000
1<<32 = 00000000000000000000000000000001
Run Code Online (Sandbox Code Playgroud)

现在,这些看起来很奇怪,因为有许多答案提供了二进制移位和旋转的方法,如二进制OR等技巧.但似乎.NET的默认行为是旋转.

这个行为是否在.NET的新版本中发生了变化?我在Visual Studio 2010中尝试过这个到.NET 2.0,它总是显示上面的行为.

如果这是默认行为,为什么人们为旋转位创建了"聪明"的解决方案?我在这里错过了什么吗?

Mar*_*ell 7

它不会"旋转"; 简单地说 - 只考虑操作数的一些位.基本上,1 << 32相同1 << 0.

来自MSDN

如果第一个操作数是int或uint(32位数),则移位计数由第二个操作数的低位5位给出.也就是说,实际移位计数是0到31位.

如果第一个操作数是long或ulong(64位数),则移位计数由第二个操作数的低位6位给出.也就是说,实际移位计数是0到63位.