求教!位储存访问的效率

haven_t 2007-01-30 02:04:09
现有大量bool数据,为了节省内存消耗,以bitset类储存,实现方法如下:
vector<bitset<32> > vb(10000000);
但是在读写时下标需要重新计算,如读写第100个数据时则要:
vb[100/32].set(100%32)
vb[100/32][100%32]

如果需要历遍所有数据时运算量会比较大,我这样设想过:
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];

}
}
不知道有没有更好的方法呢?
...全文
236 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangbin00cn 2007-02-05
  • 打赏
  • 举报
回复
bool 型最好不用
8比特只用1比特,太浪费
ahjoe 2007-02-04
  • 打赏
  • 举报
回复
除非空间不足,否则不使用位存储。
haven_t 2007-01-31
  • 打赏
  • 举报
回复
感谢fosjos的回答,我要再理解一下!
fosjos 2007-01-30
  • 打赏
  • 举报
回复
对楼上补充一下:

long int data[MAX];/*直接用数组应该快些*/
long int bit[32] = { 0, 1<<1, 1 <<2, 1 <<3, ...};

第N个就是:
data[N>>5] & bit[N&31]
设置true:
data[N>>5] |= bit[N&31];
设置false:
data[N>>5] &= !bit[N&31];
haven_t 2007-01-30
  • 打赏
  • 举报
回复

谢谢happy__888详细的解答!

Long_Sword() 的回答实在值得慢慢细味,请问能不能稍微给点思路呢?对于union我的确很少使用。
寻开心 2007-01-30
  • 打赏
  • 举报
回复
从提高速度角度来说,可以有两个方面的改造:

1. /32 变成 >> 6 移位操作比除法的速度快
2. 用位运算 (v & (1<<k)) 这样的命令来获得v的第k位
1<<k 可以预先定义在一个数组当中的, 比如
unsigned int bit[32] = { 0, 1<<1, 1 <<2, 1 <<3, ......
前面的 v & (1<<k) 就变成了 v & bit[k]

对于 int vb[] 来说, 获得第i位的操作就变成了
vb[100>>6]&bit[100%32]
返回结果依然是一个32位的整数,判断是否是0,来区别false和true的差异就是了
Long_Sword 2007-01-30
  • 打赏
  • 举报
回复
这个非常简单, 现在给你写一段 看看嫩用上不.

union Data
{
int Inter;
bool Byte[4];
};

剩下的我就不写了,你自己想把 ,,,, 看来你是新手 需要锻炼阿 呵呵 。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧