【发布时间】:2010-03-07 10:42:11
【问题描述】:
我有一个位图,想返回一个设置位位置的迭代器。现在我只是遍历整个位图,如果设置了位,那么我提供下一个位置。我相信这可以更有效地完成:例如为单个字节中的每个位组合构建静态数组并返回位置向量。这不能对整个 int 进行,因为数组太大了。但也许有一些更好的解决方案?你知道这方面的任何智能算法吗?
【问题讨论】:
标签: c++ algorithm iterator bitmap
我有一个位图,想返回一个设置位位置的迭代器。现在我只是遍历整个位图,如果设置了位,那么我提供下一个位置。我相信这可以更有效地完成:例如为单个字节中的每个位组合构建静态数组并返回位置向量。这不能对整个 int 进行,因为数组太大了。但也许有一些更好的解决方案?你知道这方面的任何智能算法吗?
【问题讨论】:
标签: c++ algorithm iterator bitmap
我可以提出几个想法。
编辑:我忍不住尝试了您为字节准备迭代器的方法。我在 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++;
}
}
第二个代码 sn-p 仅比第一个代码快 1.66 倍(~1.5s vs ~2.5s)。我认为更稀疏的位数组甚至可能使第一个代码优于第二个代码。
【讨论】: