「バイフィールド」は、 1つの変数に一緒に格納される「ワード」(つまり、、、または)の1つ以上のビットのセットint
ですlong
。char
たとえば、一部の動物に「なし」、「斑点」、および/または「縞模様」を付けることができます。また、「なし、短い、中程度、または長い」尾を持つこともできます。
したがって、尾の長さを表すには2ビットが必要です。
enum tail
{
tail_none = 0,
tail_short = 1,
tail_medium = 2,
tail_long = 3
};
次に、これらをビットとして「属性」に格納します。
enum bits_shifts
{
tail_shift = 0, // Uses bits 0..1
spots_shift = 2, // Uses bit 2
stripes_shift = 3
};
enum bits_counts
{
tail_bits = 2, // Uses bits 0..1
spots_bits = 1, // Uses bit 2
stripes_bits = 1
};
ここで、いくつかの入力からtail_size変数とhas_stripes変数has_spots変数をフェッチしたと仮定します。
int attributes;
attributes = tail_length << tail_shift;
if (has_spots)
{
attributes |= 1 << spots_shift;
}
if (has_stripes)
{
attributes |= 1 << stripes_shift;
}
後で、属性が何であるかを理解したいと思います。
switch((attributes >> tail_shift) & (1 << tail_bits)-1))
{
case tail_none:
cout << "no tail";
break;
case tail_short:
cout << "short tail";
break;
case tail_medium:
cout << "medium tail";
break;
case tail_short:
cout << "long tail";
break;
}
if (attributes & (1 << stripes_shift))
{
cout << "has stripes";
}
if (attributes & (1 << spots_shift))
{
cout << "has spots";
}
これで、これらすべてを1つの整数に格納してから、再度「釣り上げ」ました。
もちろん、次のようなこともできます。
enum bitfields
{
has_widget1 = 1,
has_widget2 = 2,
has_widget3 = 4,
has_widget4 = 8,
has_widget5 = 16,
...
has_widget25 = 16777216,
...
}
int widgets = has_widget1 | has_widget5;
...
if (widgets & has_widget1)
{
...
}
これは、いくつかのものを1つの変数にパックする簡単な方法です。