首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

求教!位储存访问的效率解决思路

2012-02-14 
求教!位储存访问的效率现有大量bool数据,为了节省内存消耗,以bitset类储存,实现方法如下:vector bitset

求教!位储存访问的效率
现有大量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];

热点排行