“双域”是“字”(即,一个 或 )中的一组一个或多个位int
,long
它们char
一起存储在一个变量中。
例如,您可以在某些动物身上有“无”、“斑点”和/或“条纹”,它也可以有“无、短、中或长”尾巴。
所以,我们需要两个位来表示尾巴的长度:
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";
}
现在,我们将所有这些存储在一个整数中,然后再次“捞出”。
你当然也可以这样做:
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)
{
...
}
这实际上只是将几个东西打包到一个变量中的一种简单方法。