我有一个位图,并希望返回设置位位置的迭代器。现在我只是走完整个位图,如果设置了位,那么我提供下一个位置。我相信这可以更有效地完成:例如,为单字节中的每个位组合构建静态数组并返回位置向量。这不能用于整个int,因为数组太大了。但也许有更好的解决方案?你知道任何智能算法吗?
答案 0 :(得分:5)
我可以提出几个想法。
编辑:我无法抗拒尝试为字节准备迭代器的方法。我在C#2.0中编写了一个代码生成器,它生成以下形式的代码:
IEnumerable<int> bits(byte[] bytes) {
for(int i=0; i<bytes.Length; ++i) {
int oi=8*i;
switch(bytes[i]) {
....
case 74: yield return oi+1; yield return oi+4; yield return oi+6; break;
....
}
}
}
我将计算随机50%填充字节数组(10Mb)的位的性能与完全不使用迭代器的代码的性能进行了比较,并且包含两个循环:
for (int i = 0; i < bytes.Length; ++i) {
byte b = bytes[i];
for (int j = 7; j >= 0; --j) {
if (((int)b & (1 << j)) != 0) s++;
}
}
第二个代码片段比第一个代码片段快1.66倍(~1.5s vs~2.5s)。我认为稀疏位数组甚至可能使第一个代码胜过第二个代码。