我已经在网络中搜索,但没有得到我需要的东西。我的大小为15,936。我需要将此位数组分为比特array的列表,每个位阵列都有32位(15936/32 = 498 bitarray列表)。
无法确切找到如何划分Bitarray。请帮忙。
谢谢,
您想要32位值的第一个使它变得非常简单,因为您可以将其复制到int[]
,然后每int
创建一个BitArray
,通过创建单元素传递数据int
数组:
int[] values = new int[bigBitArray.Length / 32];
bigBitArray.CopyTo(values, 0);
var smallBitArrays = values.Select(v => new BitArray(new[] { v })).ToList();
或更有效地,为每次迭代重复使用相同的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();
如果那些给您的位阵列的顺序与您的期望相反,请在CopyTo
呼叫后拨打Array.Reverse(values)
。
可惜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;
}
然后:
var smallBitArrays = Enumerable
.Range(0, bigBitArray.Length / 32)
.Select(offset => bigBitArray.CopySlice(offset * 32, 32))
.ToList();
您可以将您的位数组复制到字节数组中,将数组分为块并创建新的位数组:
const int subArraySizeBits = 32;
const int subArraySizeBytes = subArraySizeBits / 8;
byte[] bitData = new byte[myBitArray.Length / subArraySizeBytes];
myBitArray.CopyTo(bitData, 0);
List<BitArray> result = new List<BitArray>();
for (int index = 0; index < bitData.Length; index += subArraySizeBytes) {
byte[] subData = new byte[subArraySizeBytes];
Array.Copy(bitData, index * subArraySizeBytes, subData, 0, subArraySizeBytes);
result.Add(new BitArray(subData));
}