.NET - int32的MSB是否与平台无关?

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/64位?

.NET内部的Int32表示,包括字节序和位/字节顺序,是否与平台无关?

提前致谢!
顺便说一句,如果这是重复内容,请尽快评论。谢谢!


基于二进制数系统的内容与特定平台无关。 - kenny
4个回答

4
只要您将其视为“int”,它就是跨平台的,这包括所有算术和位(<<,>>等)操作。操作码始终确保它执行您期望的操作。
然而!如果您深入了解,它可能会有所不同;例如,BitConverter.GetBytes(int)和BitConverter.ToInt32在意字节顺序。您可以使用BitConverter.IsLittleEndian检查此内容;在“常规” .NET上,它通常为真,但在IA64上,或者某些体系结构上的XNA或Mono上,它可能为假。
相同的逻辑适用于任何不安全的代码,例如在byte*和int *之间强制转换,或通过[StructLayout]构建的任何联合。
但是在常规代码中,您应该没问题。

2

字节序(endianness)是与平台相关的,但是您在此处的代码根本不依赖于字节序。

只有当您使用低级别的东西,比如指针、联合(StructLayout:Explicit)或BitConverter时,字节序才会起作用。

位移、整数运算和整数类型之间的普通转换都是与字节序无关的。


1

您的代码将始终有效。

这不仅仅是因为 Int32 的表示不会因平台而异,而是因为您编写的代码足够好,不依赖于此:您正在使用 Int32 与其他 Int32 进行 AND 操作。如果格式发生更改,则更改将同样影响您正在测试的数字和您的 2 的幂表中的条目 - 因此代码仍将运行。


0
代码具有可移植性,但对于 int.MinValue,它会将 0 作为 MSB 返回,而实际上在十六进制中,它是 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;
}

鉴于该值不是负数。感谢您提供的代码建议。 - Ron Klein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接