3

我有以下代码用于从非负整数获取 MSB(最高有效位),Int32更具体地说:

private static readonly int[] powersOf2 = new int[]
                                        {
                                            1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384,
                                            32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304,
                                            8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912,
                                            1073741824
                                        };

public static int GetMsb(int value)
{
    for (int k = powersOf2.Length - 1; k >= 0; k--)
    {
        var bit = (value & powersOf2[k]) != 0;
        if (bit)
            return (k + 1);
    }
    return 0;
}

再次:鉴于该值不是负数。

我的问题是:
.NET 框架是否保证此代码可以在每个平台上正确运行:x86/Windows/Linux/Sun/64bit?

Int32.NET 中的表示形式(包括字节顺序和位/字节顺序)是否与平台无关?

提前致谢!
顺便说一句,如果这是一种重复 - 请尽快对此发表评论。谢谢!

4

4 回答 4

4

只要您将其视为int,是的,它与平台无关。这包括所有算术和按位(<<>>)操作。操作码始终确保它符合您的期望。

然而!如果您在封面下面偷看,那可能很重要;例如BitConverter.GetBytes(int)BitConverter.ToInt32关心字节序。你可以用BitConverter.IsLittleEndian; 它通常true在“常规”.NET 上,但false在某些架构上可能在 IA64 或 XNA 或 Mono 上。

相同的逻辑适用于(例如)在byte*and之间进行强制转换的任何不安全代码int*,或任何通过 构造的联合[StructLayout]

但在常规代码中,你应该没问题。

于 2010-12-24T08:23:43.093 回答
2

字节序取决于平台,但您的代码完全不依赖于字节序。

Endianness 仅在您使用指针、联合(StructLayout:Explicit)或 BitConverter 等低级内容时发挥作用。

整数类型之间的位移、整数算术和正常转换是字节序不可知的。

于 2010-12-24T09:31:21.580 回答
1

您的代码将始终有效。

这并不是因为 Int32 的表示不会因平台而异,而是因为您的代码编写得足够好以至于不依赖它:您正在将 Int32 与其他 Int32 进行 ANDing。如果格式确实发生了更改,则更改将同样影响您正在测试的数字以及您的 2 次幂表中的条目 - 因此代码仍然可以工作。

于 2010-12-24T08:24:18.320 回答
0

该代码是可移植的,但是,它返回 0,因为它的 MSBint.MinValue实际上是六进制的 0x80000000,因为您正在使用有符号整数。我相信,这是一个适用于所有位的代码,并且不需要任何预先计算的值:

public static int GetMsb(int value)
{
    for(int i = 31; i >= 0; i--)
    {
        if ((value & 0x80000000) != 0) return i;
        value <<= 1;
    }
    return 0;
}

或带有uint

public static int GetMsb(uint value)
{
    for(int i = 31; i >= 0; i--)
    {
        if ((value & 0x80000000) != 0) return i;
        value <<= 1;
    }
    return 0;
}
于 2010-12-24T10:28:36.297 回答