他の人が言ったように、ビットフィールドでやりたいことを正確に行うことはできません。最大のスペース効率で多数の 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() 関数は演習として残します。