【问题标题】:How can I convert BitArray to single int?如何将 BitArray 转换为单个 int?
【发布时间】:2011-07-14 01:57:06
【问题描述】:

如何将BitArray 转换为单个int

【问题讨论】:

  • BitArray 到 int Array 还是字面上的 BitArray 到单个整数?

标签: c# .net binary integer base-class-library


【解决方案1】:
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];

}

【讨论】:

  • 哇...我不认为将所有位都放入一个整数值中会起作用 - 但确实如此!
  • 参考这个:codereview.stackexchange.com/questions/3796/…需要检查bitArray的长度
  • 不错的技巧,但是它可能在各种平台上存在与字节顺序(字节序)相关的问题。最好使用byte数组作为位数组复制的目标,然后使用BitConverter.ToInt32(array, 0)方法。
【解决方案2】:
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;
}

【讨论】:

  • 你能解释一下为什么 OP 应该使用它而不是其他解决方案吗?
  • @AustinHenley 我为调试目的编写了这个解决方案。我可以单步执行我的代码以查看数字是如何转换的。我不确定您是否可以使用第一个解决方案来做到这一点。
  • 有趣的是,第一个解决方案在 WinRT 上不可用(可能是因为 ARM 处理器保存数字的方式)
  • 我必须使用它,因为它在 ARM 上不可用。
  • .NET Core 堆栈可能没有 BitArray.CopyTo。话虽如此,为什么不是1 &lt;&lt; i 而不是Convert.ToInt16(Math.Pow(2, i))
【解决方案3】:

参考这篇文章 (#43935747)。值 X 很短,我设置了两个位(6 和 10),如下所示: 短 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 &lt;&lt; bitToSet) 让它一目了然。并不是说这段代码难以理解,而是它依赖于一些“精心挑选的巧合”的组合,而不是明明做对的事。
【解决方案4】:

这个版本:

  • 适用于最多 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;
}

【讨论】:

  • 你能解释一下这比 7 年前公认的解决方案更好吗?它是否更快、更准确、更擅长错误处理、使用更少的内存?
猜你喜欢
  • 2018-02-27
  • 2021-11-25
  • 2012-06-27
  • 2017-07-16
  • 2010-12-20
  • 2014-05-22
  • 1970-01-01
  • 2016-09-06
  • 2017-05-31
相关资源
最近更新 更多