我们有这个例子:
struct X {
int e0 : 6;
int e1 : 6;
int e2 : 6;
...
int e10 : 6;
};
struct X c;
如何“自动”访问成员,如下所示:
c.e {0-10}?
如果我想读c.e0,那么c.e1 ...
如果我的结构有1000个元素,我不认为我应该编写这么多代码,对吧?
你能帮我解决一个问题吗? 我提到我已经阅读过与此问题有关的其他帖子,但我没有找到解决方案。
非常感谢!
答案 0 :(得分:4)
正如其他人所说,你不能用比特字段做你想要的。看起来你想要存储大量的6位整数,以最大的空间效率。我不会争论这是不是一个好主意。相反,我将使用C ++功能进行封装(未经测试),呈现一种老式的C方式。这个想法是4个6位整数需要24位或3个字符。
// In each group of 3 chars store 4 6 bit ints
const int nbr_elements = 1000;
struct X
{
// 1,2,3 or 4 elements require 3 chars, 5,6,7,8 require 6 chars etc.
char[ 3*((nbr_elements-1)/4) + 3 ] storage;
int get( int idx );
};
int X::get( int idx )
{
int dat;
int offset = 3*(idx/4); // eg idx=0,1,2,3 -> 0 idx=4,5,6,7 -> 3 etc.
char a = storage[offset++];
char b = storage[offset++];
char c = storage[offset];
switch( idx%4) // bits lie like this; 00000011:11112222:22333333
{
case 0: dat = (a>>2)&0x3f; break;
case 1: dat = ((a<<4)&0x30) + ((b>>4)&0x0f); break;
case 2: dat = ((b<<2)&0x3c) + ((c>>6)&0x03); break;
case 3: dat = c&0x3f; break;
}
return dat;
}
我将把伴侣put()函数作为练习。
答案 1 :(得分:3)
听起来结构不适合您正在尝试的工具。您需要array或vector。数组用于存储许多相同类型的数据。向量是数组包装器,可以自动管理项目的添加和删除。
如果您需要相同数据的列表,以及其他一些数据(例如字符串),您可以创建数组或结构的向量部分。
struct X {
int[10] numbs;
string name;
};
X c;
答案 2 :(得分:2)
你做不到。要做到这一点,需要某种形式的反射,C或C ++都不支持。
答案 3 :(得分:2)
这样的事情怎么样:
char getByte(char *startPos, int index) {
int i = (index*6) / 8;
if (index % 4 == 0)
return 0b11111100 & startPos[i] >> 2;
else if (index % 4 == 3)
return 0b00111111 & startPos[i];
else if (index % 4 == 2)
return (0b00001111 & startPos[i] << 2) | (0b11000000 & startPos[i+1] >> 6);
else
return (0b00000011 & startPos[i] << 4) | (0b11110000 & startPos[i+1] >> 4);
}
答案 4 :(得分:2)
由于您的位域大小相同,您可以封装std::bitset
(或vector<bool>
,gulp ...)并提供您自己的迭代器(每个增量将书签移动6位)和{{ 1}}(等)使您的代码更容易编写。
我确信与比特场相比,性能会很糟糕。