将 system.collections.bitarray 划分为每个 32 位的子位数组

Nav*_*mar 1 .net c#

我在网上搜索过,但没有得到我需要的东西。我有一个大小为 15,936 的位数组。我需要将此位数组划分为位数组列表,每个位数组有 32 位(15936/32 = 498 位数组列表)。

无法准确找到如何划分位数组。请帮忙。

谢谢,

Jon*_*eet 5

第一个您想要 32 位值使这很容易,因为您可以将它复制到 an int[],然后创建一个BitArrayper int,通过创建一个单元素int数组来传递数据:

int[] values = new int[bigBitArray.Length / 32];
bigBitArray.CopyTo(values, 0);
var smallBitArrays = values.Select(v => new BitArray(new[] { v })).ToList();
Run Code Online (Sandbox Code Playgroud)

或者更有效地,int[]为每次迭代重复使用相同的内容:

int[] values = new int[bigBitArray.Length / 32];
bigBitArray.CopyTo(values, 0);
// Reuse this on every iteration, to avoid creating more arrays than we need.
// Somewhat ugly, but more efficient.
int[] buffer = new int[1];
var smallBitArrays = values.Select(v =>
{ 
    buffer[0] = v; 
    return new BitArray(buffer))
}).ToList();
Run Code Online (Sandbox Code Playgroud)

如果它们以与您期望的顺序相反的顺序为您提供位数组,请Array.Reverse(values)在调用后CopyTo调用。

遗憾的是BitArray,没有构造函数采用现有数组、偏移量和计数......这将使其效率显着提高。(当然,“切片复制”操作也是如此。)

更通用的选项是为该“切片副本”部分创建一个扩展方法:

public static BitArray CopySlice(this BitArray source, int offset, int length)
{
    // Urgh: no CopyTo which only copies part of the BitArray
    BitArray ret = new BitArray(length);
    for (int i = 0; i < length; i++)
    {
         ret[i] = source[offset + i];
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

然后:

var smallBitArrays = Enumerable
    .Range(0, bigBitArray.Length / 32)
    .Select(offset => bigBitArray.CopySlice(offset * 32, 32))
    .ToList();
Run Code Online (Sandbox Code Playgroud)

  • 这将不起作用,因为带有 `int` 参数的 `BitArray` 构造函数不会初始化 `BitArray`,而是设置其容量。 (2认同)