4

我们有这个例子:

struct X {
  int e0 : 6;
  int e1 : 6;
  int e2 : 6;
  ...
  int e10 : 6;
};

struct X c;

如何“自动”访问成员,例如:
ce{0-10} ?
说如果我想读 c.e0,那么 c.e1 ...
如果我的结构将有 1000 个元素,我认为我不应该写这么多代码,对吧?

你能帮我一个解决方法,一个想法吗?
我提到我已经阅读了与此问题相关的其他帖子,但我没有找到解决方案。

非常感谢 !

4

5 回答 5

5

正如其他人所说,你不能用位域做你想做的事。看起来您想以最大的空间效率存储大量 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() 函数留作练习。

于 2010-11-08T22:01:31.840 回答
3

听起来结构不是您想要做的事情的正确工具。您需要一个数组或一个向量。数组用于存储多个相同类型的数据。向量是自动管理项目的添加和删除的数组包装器。

如果您需要相同数据的列表和其他一些数据(例如字符串),您可以将数组或向量作为结构的一部分。

struct X {
   int[10] numbs;
   string name;
};

X c;
于 2010-11-08T19:52:12.743 回答
2

你不能。要做到这一点需要某种形式的反射,这在 C 或 C++ 中都不支持。

于 2010-11-08T19:47:14.853 回答
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);
}
于 2010-11-08T20:03:29.760 回答
2

由于您的位域大小相同,您可以封装std::bitset(或vector<bool>,gulp ...)并提供自己的迭代器(每个增量移动书签六位)和operator[](等)以使您的代码更易于编写。

我敢肯定,与位域相比,性能会很糟糕。

于 2010-11-08T20:04:34.043 回答