求教!位储存访问的效率
现有大量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];
}
}
不知道有没有更好的方法呢?
[解决办法]
这个非常简单, 现在给你写一段 看看嫩用上不.
union Data
{
int Inter;
bool Byte[4];
};
剩下的我就不写了,你自己想把 ,,,, 看来你是新手 需要锻炼阿 呵呵 。
[解决办法]
从提高速度角度来说,可以有两个方面的改造:
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 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];