我如何使用 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." );
这声明了一个结构,可以容纳两条信息:flags
和state
,分别占用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
}
我目前正在处理的我的数据单元(网络数据包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." );
这声明了一个结构,可以容纳两条信息:flags
和state
,分别占用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
}