我当前正在处理的数据单元(网络数据包标头)在其定义中有2个标志,存储在字节字段中并通过按位运算符访问。不幸的是,我只需要2位并想到我能用其他6位做什么?我可以用它们来存储号码吗?
我可以使用它们存储一些内部州代码(值范围小于char
吗?)并且不要浪费它们。
是否有任何小于字节的数据类型,我如何在C ++中使用它们?如果不是,我应该浪费这些位并让它们没有意义吗?
答案 0 :(得分:2)
您可以使用位字段,如here所述。
改编自该页面:
#include <iostream>
struct S {
// 6-bit unsigned field,
// allowed values are 0...63
unsigned int b : 6;
};
int main()
{
S s = {7};
++s.b;
std::cout << s.b << '\n'; // output: 8
}
答案 1 :(得分:1)
在C ++中,没有小于char
的数据类型,根据定义,它是一个字节。但是,您不需要专用的数据类型来访问值的位。 Bitwise logic and Bitwise Shift operators就足够了。
如果您不能牺牲6位(这假定为8位字节),您可能需要考虑std::vector<bool>特化。但请注意,常规std::vector存在许多限制和差异。
使名称可访问的数据类型的单个(连续)位的另一个选项是使用bit fields:
struct S {
unsigned int flags : 2;
unsigned int state : 6;
};
static_assert( sizeof( S ) == 1, "Packing is implementation-defined." );
这声明了一个可以容纳两条信息的结构:flags
和state
,分别占用2位和6位。相邻的位域通常被打包在一起(虽然这种行为是实现定义的)。