主题:[讨论]位(bitset)读写的效率
haven
[专家分:0] 发布于 2007-01-29 22:54:00
现有大量的布尔类型数据,为了节省空间,把数据以bitset<32>类储存,实现方法如下:
vector<bitset<32> > vb(10000000);
但是在读写时下标需要重新计算,如读写第100个数据时则要:
vb[100/32].set(100%32)
vb[100/32][100%32]
如果需要历遍所有数据时运算量会比较大,请问有何方法提高效率呢?
回复列表 (共6个回复)
沙发
雪光风剑 [专家分:27190] 发布于 2007-01-30 11:32:00
直接用偏移操作可以吗?
板凳
haven [专家分:0] 发布于 2007-01-30 12:00:00
遍历数据我这样设想过:
vector<bitset<32> >::iterator iter
int Bit=0;
bool result;
for (iter=vb.begin(); iter!=vb.end();)
{
if(Bit<32)
{
result=iter[Bit];
++Bit;
}
else
{
iter++;
Bit=0;
result=iter[Bit];
}
}
不知道有没有更好的方法呢?
3 楼
rickone [专家分:15390] 发布于 2007-01-31 00:19:00
用>>5代替/32
用& 0x1F代替%32
4 楼
haven [专家分:0] 发布于 2007-01-31 13:38:00
谢谢版主的指教!
5 楼
medie2005 [专家分:30] 发布于 2007-03-11 12:53:00
[quote]用>>5代替/32
用& 0x1F代替%32[/quote]
实际上,现在的任何编译器都进行了上面的优化,否则,这个编译器还有什么用?
因此,用这样的语句:vb[100/32].set(100%32)、vb[100/32][100%32]实际上已经是很高效的了,因为编译器已经将其优化了。
6 楼
haven [专家分:0] 发布于 2007-03-19 13:00:00
我也想过这个问题,为了增加代码的可读性,还是直接使用除法比较好
我来回复