我的问题或多或少是标题中的内容;我想知道是否有一种快速的方法来遍历一系列位并找到设置的每个位。
更详细的信息:
我目前正在研究代表一组对象的数据结构。为了支持我需要的一些操作,该结构必须能够在内部执行非常快速的子集交集。我想出的解决方案是让结构超集的每个子集由一个“位数组”表示,其中每个位映射到数组中保存超集数据的索引。示例:如果在子集中设置了位 #1,则超集数组中索引 1 处的元素存在于子集中。
每个子集由一个足够大的 ulong 数组组成,足以表示整个超集(如果超集包含 256 个元素,则数组的大小必须为 256 / 64 = 4)。要找到 2 个子集 S1 和 S2 的交集,我可以简单地遍历 S1 和 S2 的数组,并在每个索引处找到 ulong 之间的按位与。
现在回到我的问题的真正意义:为了返回子集的数据,我必须遍历子集的“位数组”中的所有位并找到设置的位。这就是我目前的做法:
/// <summary>
/// Gets an enumerator that enables enumeration over the strings in the subset.
/// </summary>
/// <returns> An enumerator. </returns>
public IEnumerator<string> GetEnumerator()
{
int bitArrayChunkIndex = 0;
int bitArrayChunkOffset = 0;
int bitArrayChunkCount = this.bitArray.Length;
while(bitArrayChunkIndex < bitArrayChunkCount)
{
ulong bitChunk = bitArray[bitArrayChunkIndex];
// RELEVANT PART
if (bitChunk != 0)
{
int bit = 0;
while (bit < BIT_ARRAY_CHUNK_SIZE /* 64 */)
{
if(bitChunk.BitIsSet(bit))
yield return supersetData[bitArrayChunkOffset + bit];
bit++;
}
}
bitArrayChunkIndex++;
bitArrayChunkOffset += BIT_ARRAY_CHUNK_SIZE;
// END OF RELEVANT PART
}
}
有什么明显的方法可以优化这个吗?有什么技巧可以让它很快完成吗?谢谢!