如何将 BitArray 转换为单个 int?

48

如何将 BitArray 转换为一个整数 int


将BitArray转换为int数组,还是将BitArray直接转换为单个整数? - Brandon Boone
4个回答

75
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];

}

1
哇...我没想到把所有的位放入一个整数值中会起作用 - 但它确实起作用了! - codekaizen
4
请参考这个链接:http://codereview.stackexchange.com/questions/3796/converting-binary-value-from-bitarray-to-an-int-and-back-in-c/3797#3797 需要检查 bitArray 的长度。 - coder_bro
5
不错的技巧,但在各种平台上可能存在与字节顺序(端序)相关的问题。最好将byte数组用作位数组复制的目标,然后使用BitConverter.ToInt32(array, 0)方法。 - Jozef Benikovský

10

这个版本:

  • 适用于高达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;
}

2
你能解释一下这个方案比7年前被接受的解决方案更好在哪里吗?它是否更快、更精准、更擅长错误处理、使用更少的内存? - nvoigt

9
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;
}

你能解释一下为什么这个方案比其他方案更好吗? - Austin Henley
1
@AustinHenley 我写了这个解决方案来进行调试。我可以逐步执行我的代码,以查看数字是如何转换的。我不确定你是否可以使用第一个解决方案来实现这一点。 - K4KNOWLEDGE
1
有趣的是,第一种解决方案在WinRT上不可用(可能是因为ARM处理器保存数字的方式)。 - tec-goblin
1
我必须使用这个,因为它在ARM上不可用。 - Mike Christiansen
5
.NET Core堆栈可能没有BitArray.CopyTo方法。既然如此,为什么不使用1 << i而不是Convert.ToInt16(Math.Pow(2, i))呢? - ChristopheD

1
参考此帖子 (#43935747)。值 X 是一个短类型,我设置了两个位(6 和 10),如下所示: short X=1;
        var result = X;
        var bitsToSet = new [ ] { 5,9 };
        foreach ( var bitToSet in bitsToSet )
            {
            result+=( short ) Math.Pow ( 2,bitToSet );
            }
        string binary = Convert.ToString ( result,2 );

现在我想从值X中读取特定的所有位,并将其放入数组或位类型(如bool Val1= bit1,bool Val2=bit2等)中。

我是一个新手,我觉得这对你们来说很简单。


好的,但你应该将它改为 |=(short)(1 << bitToSet),这样一眼就能看出来。这段代码并不是无法理解,但它依赖于一些“精心选择的巧合”组合而成,而不是显然地做正确的事情。 - harold

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