C++ - 如何使用位域

标签 c++ bit-fields

所以我最近遇到了这样的事情

unsigned char ch : 7;

在一个结构中。我读了一点。显然这些被称为位域。它们用于设置 char 可以接收的数据宽度。 但是我们如何使用这些东西。例如,我知道我们可以将变量 ch 设置为一个字节

unsigned char ch = 0x61;
cout << ch << endl;

这将输出

a

但是,我们如何处理位域?

unsigned char ch : 7;
ch = 0x61;                //This doesn't work for some reason

unsigned char ch : 7;
unsigned char ch = 0x61/  //Neither does this.

感谢帮助

最佳答案

位域只能在结构化数据类型中使用,即 structclassunion 类型。目的是允许您将多个成员打包在一个字节中,而无需编写大量显式移位和掩码。例如,你可以这样写:

struct halfbyte_t {
    unsigned int half1: 4;
    unsigned int half2: 4;
} halfbyte;

这声明了一个名为 halfbyte 的变量,它包含两个 4 位成员,它们将被打包到一个 8 位字节中,而不是如果你只是声明它们就不必使用 2 个字节 无符号字符

您可以像访问任何其他结构成员一样访问它们:

halfbyte.half1 = 3;
cout << halfbyte.half3;

如果结构中有很多 bool 标志,1 位字段特别有用,因为您不必为每个标志设置一个单独的字节。

struct flag_t {
    unsigned int flag1: 1;
    unsigned int flag2: 1;
    unsigned int flag3: 1;
    unsigned int flag4: 1;
    ...
};

关于C++ - 如何使用位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35857111/

相关文章:

c++ - 在 VIsual studio 2010 express 中使用 GLEW、SDL 和 OpenGL 无法解析的外部符号

c++ - Clang 警告 "-Wsigned-enum-bitfield"的含义

c++ - boolean 值对位域的优势

c - C 编译器如何为位域定义的结构分配结构内存?

c - 使用按位运算符在 C 中将颜色与位域混合?

c++ - 如何在C++中的赋值中命名类标识符?

c++ - 字符串正则表达式替换需要 6 个参数但是..MinGW,CMake,w7

c++ - 插入 C++ vector 时调用构造函数和析构函数

c++ - 如何为 Linux C++ 应用程序获取 timespec_add_safe()

c++ - 使用 -1 将所有位设置为真是否安全?