如何将BitArray转换为单个int?

Vla*_*huk 30 .net c# binary integer base-class-library

我怎样才能转换BitArray成单身int?最快的方式请...

Luc*_*oli 55

private int getIntFromBitArray(BitArray bitArray)
{

    if (bitArray.Length > 32)
        throw new ArgumentException("Argument length shall be at most 32 bits.");

    int[] array = new int[1];
    bitArray.CopyTo(array, 0);
    return array[0];

}
Run Code Online (Sandbox Code Playgroud)

  • 请参考:http://codereview.stackexchange.com/questions/3796/converting-binary-value-from-bitarray-to-an-int-and-back-in-c/3797#3797需要检查长度bitArray (4认同)
  • 不错的技巧,但是它可能存在与各种平台上的字节顺序(字节序)相关的问题。最好使用 `byte` 数组作为位数组复制的目标,然后使用 `BitConverter.ToInt32(array, 0)` 方法。 (2认同)

小智 8

private int getIntFromBitArray(BitArray bitArray)
{
    int value = 0;

    for (int i = 0; i < bitArray.Count; i++)
    {
        if (bitArray[i])
            value += Convert.ToInt16(Math.Pow(2, i));
    }

    return value;
}
Run Code Online (Sandbox Code Playgroud)

  • .NET Core堆栈可能没有BitArray.CopyTo.话虽如此,为什么不是`1 << i`而不是`Convert.ToInt16(Math.Pow(2,i))`? (3认同)

Wil*_*rin 5

这个版本:

  • 适用于高达 64 位
  • 不依赖于 BitArray 实现细节的知识
  • 不会不必要地分配内存
  • 不抛出任何异常(如果您期望更多位,请随意添加检查)
  • 应该超过合理的性能

执行:

public static ulong BitArrayToU64(BitArray ba)
{
    var len = Math.Min(64, ba.Count);
    ulong n = 0;
    for (int i = 0; i < len; i++) {
        if (ba.Get(i))
            n |= 1UL << i;
    }
    return n;
}
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下这比 7 年前接受的解决方案更好吗?它是否更快、更准确、更擅长错误处理、使用更少的内存? (2认同)