4

在java中有一个名为rotatetoleft的函数生成一个生成的数字

int n;
n = Integer.rotateLeft(1, 5);
System.out.print(n);

输出; 32

c#中有什么与此类似的?

4

2 回答 2

4

听起来您只是在<<操作员之后,但这执行左移;它不会旋转到 LSB。为此,您必须混合使用班次和 OR。例如:

static int RotateLeft(int value, int shift)
{
    return (value << shift) | (value >> (32 - shift));
}

请注意,如果value由于右移符号扩展而设置了它的最高位,这将无法正常工作。您可以通过执行以下算术来解决此问题uint

static int RotateLeft(int value, int shift)
{
    unchecked
    {
        uint uvalue = (uint) value;
        uint uresult = (uvalue << shift) | (uvalue >> 32 - shift);
        return (int) uresult;
    }
}
于 2013-08-30T13:48:52.037 回答
0

我认为 C# 中没有类似的东西,我在这里发现了一个类似的问题,并且答案表明了这种实现:(C 语言)

unsigned int _rotl(const unsigned int value, int shift) 
{
    if ((shift &= sizeof(value) * 8 - 1) == 0)
      return value;
    return (value << shift) | (value >> (sizeof(value)*8 - shift));
}

unsigned int _rotr(const unsigned int value, int shift) 
{
    if ((shift &= sizeof(value) * 8 - 1) == 0)
      return value;
    return (value >> shift) | (value << (sizeof(value)*8 - shift));
}
于 2013-08-30T13:55:35.780 回答