【问题标题】:C++ - How to use bitfieldsC++ - 如何使用位域
【发布时间】:2016-06-21 19:01:14
【问题描述】:

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

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.

感谢您的帮助

【问题讨论】:

标签: c++ bit-fields


【解决方案1】:

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

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

这声明了一个名为 halfbyte 的变量,其中包含两个 4 位成员,它们将被打包到一个 8 位字节中,而如果您刚刚声明它们 unsigned char,则不必使用 2 个字节。

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

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

如果结构中有大量布尔标志,则 1 位字段特别有用,因为您不必为每个标志设置单独的字节。

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

【讨论】:

  • 谢谢。这是一个很好的解释。不过,我有一个后续问题。当你说两个半字节可以打包成一个 8 位字符时,我该怎么做呢?
  • @Q_A 最便携和语义上最正确的是算术,例如(half1 &lt;&lt; 4) | half2 或相反。你可以用工会破解它或重新解释演员表,但结果并不总是一致的。另见stackoverflow.com/questions/19376426/…。主要用途是在内存受限的环境中节省空间。如果您发现经常需要组合它们的值,那么您可能会重新考虑使用位域;它们确实适用于语义上独立的事物。
  • @Q_A 你不要这样做,它是由编译器自动完成的。这就是重点。
  • 位域的布局是不可移植的,所以如果你想编写可移植的代码,它们的使用是有限的
  • @MM 这是一个笼统的声明,更多的 FUD 没有对“limited”的解释:代码可以将它们用于此答案中描述的功能,它们只是不是可在原始二进制 I/O 中使用 - 但也可以这样说,例如int 由于字节顺序和编码的多样性(符号幅度、2s 补码...)。
猜你喜欢
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多