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

構造体は、あなたがやろうとしていることに適したツールではないようです。arrayまたはvectorが必要です。配列は、多数の同じタイプのデータを格納するために使用されます。ベクトルは、項目の追加と削除を自動的に管理する配列ラッパーです。

同じデータと他のデータ (文字列など) のリストが必要な場合は、構造体の配列またはベクトル部分を作成できます。

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

X c;
于 2010-11-08T19:52:12.743 に答える
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...) し、独自のイテレータ (ブックマークを 6 ビットずつ移動するインクリメント) およびoperator[](など) を提供して、コードをより簡単に記述できるようにすることができます。

ただし、ビットフィールドに比べてパフォーマンスが低下すると確信しています。

于 2010-11-08T20:04:34.043 に答える
2

できません。これを行うには、何らかの形式のリフレクションが必要になりますが、これは C または C++ ではサポートされていません。

于 2010-11-08T19:47:14.853 に答える