我如何使用 6 位来存储值?

How can i use 6 bits to store value?

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

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

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

在 C++ 中,没有比 char 更小的数据类型,根据定义,它是一个字节。但是,您不需要专用数据类型来访问值的位。 Bitwise logic and Bitwise Shift operators 足够了。

如果您不能忍受牺牲 6 位(假设是 8 位字节),您可能需要考虑 std::vector<bool> specialization. Note, though, that there are a number of restrictions and differences to a regular 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位。相邻的位字段通常打包在一起(尽管这种行为是实现定义的)。

您可以使用位域,如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
}