C++掩码形式存储读取数据
- 有n个控件,以id表示,控件状态只有两种:选中和没选中
- id 以数字按序排列: 0,1,2,…
- 状态0表示未选中,1表示选中
- 只要其中一个控件状态发生改变,所有空间的状态都更新
- 为了节省内存,采用掩码形式存储:
定义char(8bit)类型,可以存8个控件的状态
定义short(2 * 8bit)类型,可以存16个控件的状态
定义int(4 * 8bit)类型,可以存32个控件的状态
…
#include <iostream>
#include <map>
#include <algorithm>
#include <math.h>
int main()
{
//存储流程
std::map<int,int> mapTestState; //有序容器,按key从小到大排序,无重复key
mapTestState.insert(std::make_pair(0,0));
mapTestState.insert(std::make_pair(0,0));
mapTestState.insert(std::make_pair(1,1));
mapTestState.insert(std::make_pair(3,1));
mapTestState.insert(std::make_pair(2,1));
mapTestState.insert(std::make_pair(3,0));
//print mapTestState
std::for_each(mapTestState.begin(),mapTestState.end(),
[](const std::pair<int,int>& value)
{ std::cout << "first= " << value.first << ", second= " << value.second<<std::endl;});
//计算存储值
int iValue = 0;
std::for_each(mapTestState.begin(),mapTestState.end(),
[&iValue](const std::pair<int,int>& value)
{iValue +=(value.second * pow(2.0,value.first));});
//可存储为void* 传输 //可自定义
void* pParamters = reinterpret_cast<void*>(&iValue);
//--------------------
//读取流程
const unsigned int* puiStatus = reinterpret_cast<const unsigned int*>(pParamters);
if (NULL == puiStatus)
{
std::cout<< "NULL == puiStatus."<<std::endl;
return 0;
}
std::cout<<"puiStatus sizeof = "<<sizeof(*puiStatus)<<std::endl;
std::map<int,int> mapState;
int iSize = 8 * sizeof(*puiStatus); // 1 char = 8 bit
for(int j = 0; j< iSize; ++j)
{
int iStatus = ((*puiStatus)>>j) & 0x01; //计算每一位的状态
mapState.insert(std::make_pair(j , iStatus));
}
//print mapState
std::for_each(mapState.begin(),mapState.end(),
[](const std::pair<int,int>& value)
{std::cout<<"mapState first = "<<value.first<<", second= "<<value.second<<std::endl;});
system("pause");
return 0;
}
first= 0, second= 0
first= 1, second= 1
first= 2, second= 1
first= 3, second= 1
puiStatus sizeof = 4
mapState first = 0, second= 0
mapState first = 1, second= 1
mapState first = 2, second= 1
mapState first = 3, second= 1
mapState first = 4, second= 0
mapState first = 5, second= 0
mapState first = 6, second= 0
mapState first = 7, second= 0
mapState first = 8, second= 0
mapState first = 9, second= 0
mapState first = 10, second= 0
mapState first = 11, second= 0
mapState first = 12, second= 0
mapState first = 13, second= 0
mapState first = 14, second= 0
mapState first = 15, second= 0
mapState first = 16, second= 0
mapState first = 17, second= 0
mapState first = 18, second= 0
mapState first = 19, second= 0
mapState first = 20, second= 0
mapState first = 21, second= 0
mapState first = 22, second= 0
mapState first = 23, second= 0
mapState first = 24, second= 0
mapState first = 25, second= 0
mapState first = 26, second= 0
mapState first = 27, second= 0
mapState first = 28, second= 0
mapState first = 29, second= 0
mapState first = 30, second= 0
mapState first = 31, second= 0
可以根据具体的控件id,获取控件状态