如何使用6位存储值?

时间:2015-07-14 23:17:43

标签: c++ types bit-manipulation bit flags

我当前正在处理的数据单元(网络数据包标头)在其定义中有2个标志,存储在字节字段中并通过按位运算符访问。不幸的是,我只需要2位并想到我能用其他6位做什么?我可以用它们来存储号码吗?

我可以使用它们存储一些内部州代码(值范围小于char吗?)并且不要浪费它们。

是否有任何小于字节的数据类型,我如何在C ++中使用它们?如果不是,我应该浪费这些位并让它们没有意义吗?

2 个答案:

答案 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." );

这声明了一个可以容纳两条信息的结构:flagsstate,分别占用2位和6位。相邻的位域通常被打包在一起(虽然这种行为是实现定义的)。