在c#中使用ush的bitShifting

时间:2012-12-11 04:04:50

标签: c# bit-manipulation

如果我想将4个字节转换为int,我可以这样做:

        byte[] b = BitConverter.GetBytes(i1);
        int i2 = BitConverter.ToInt32(b,0);
        int i3 = b[0] | (b[1]<<8) | (b[2]<<16) | (b[3]<<24);

然后i1,i2,i3都会相等。

但我如何为uint做同样的事情?这样:

        uint u1 = uint.MaxValue-1000;
        byte[] b = BitConverter.GetBytes(u1);
        uint u2 = BitConverter.ToUInt32(b,0);
        uint u3 = (uint)(b[0] | (b[1]<<8) | (b[2]<<16) | (b[3]<<24));

会导致大量过滤。

2 个答案:

答案 0 :(得分:5)

如果在已检查的上下文中,它只会抛出该异常。请参阅:http://msdn.microsoft.com/en-us/library/y3d0kef1(v=vs.80).aspx

没有例外:

uint u1 = uint.MaxValue - 1000;
byte[] b = BitConverter.GetBytes(u1);
uint u2 = BitConverter.ToUInt32(b, 0);
uint u3 = (uint) (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24));

异常:

checked
{
    uint u1 = uint.MaxValue - 1000;
    byte[] b = BitConverter.GetBytes(u1);
    uint u2 = BitConverter.ToUInt32(b, 0);
    uint u3 = (uint) (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24));
}

没有例外

checked
{
    unchecked
    {
        uint u1 = uint.MaxValue - 1000;

        byte[] b = BitConverter.GetBytes(u1);
        uint u2 = BitConverter.ToUInt32(b, 0);
        uint u3 = (uint) (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24));

        Console.WriteLine(u1 + " " + u2 + " " + u3);
    }
}

确保您没有使用/ checked选项进行编译。

从int转换为uint引发异常。在字节上使用shift运算符(使用uint u3 = ...的行)隐式地将它们转换为int。 MSB打开(“1”)的uint是负int,超出uint的范围。使用int不会导致此类异常,因为没有可能引发溢出异常的显式强制转换。

答案 1 :(得分:0)

我运行的代码的uint值最高为4,294,967,295,这是最大值,并且在所有情况下都能正常工作。