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

How can i use 6 bits to store value?

本文关键字:存储 何使用      更新时间:2023-10-16

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

我可以使用它们来存储一些内部状态代码(值范围小于char?(,而不仅仅是浪费它们。

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

您可以使用位字段,如此处所述。

改编自该页面:

#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
}

在C++中,没有小于char的数据类型,根据定义,这是一个字节。但是,您不需要专用数据类型来访问值的位。按位逻辑和按位移位运算符就足够了。

如果你不能忍受牺牲6位(这是假设8位字节(,你可能要考虑std::vector的专业化。但请注意,常规 std::vector 存在许多限制和差异。

使数据类型的单个(连续(位可通过名称访问的另一个选项是使用位字段:

struct S {
    unsigned int flags : 2;
    unsigned int state : 6;
};
static_assert( sizeof( S ) == 1, "Packing is implementation-defined." );

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