Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

C++每日一记:位域 #91

Open
yuanrui opened this issue Jan 14, 2025 · 0 comments
Open

C++每日一记:位域 #91

yuanrui opened this issue Jan 14, 2025 · 0 comments

Comments

@yuanrui
Copy link
Owner

yuanrui commented Jan 14, 2025

位域

概述

在C++中,位域(bit-field)是一种特殊的成员变量,一个位域中含有一定数量的二进制位。位域通常用于节省内存空间,特别是在处理硬件寄存器或需要精确控制内存布局的情况下。

位域的定义

位域通过在结构体(struct)、类(class)或联合体(union)中使用冒号(:)来指定成员变量占用的位数。例如:

typedef unsigned int Bit;
struct Bit8
{
    Bit bit0 : 4;   // 当修改 bit0 的二进制位为 5 时, 对结构体对象使用 sizeof 函数获取到的结果为 8
    Bit bit1 : 4;
    Bit bit2 : 4;
    Bit bit3 : 4;
    Bit bit4 : 4;
    Bit bit5 : 4;
    Bit bit6 : 4;
    Bit bit7 : 4;
};

位域的使用

位域的使用方式与普通成员变量类似,可以通过点运算符(.)来访问和修改它们的值。例如:

void TestBitField()
{
    using namespace std;
    Bit8 b1;
    b1.bit0 = 256;
    b1.bit1 = 18;
    b1.bit2 = -1;
    b1.bit3 = -2;

    cout << "Bit8 size:" << sizeof(b1) << endl;
    cout << "Bit8 bit0:" << b1.bit0 << endl;
    cout << "Bit8 bit1:" << b1.bit1 << endl;
    cout << "Bit8 bit2:" << b1.bit2 << endl;
    cout << "Bit8 bit3:" << b1.bit3 << endl;
}

测试代码运行结果:

Bit8 size:4
Bit8 bit0:0
Bit8 bit1:2
Bit8 bit2:15
Bit8 bit3:14

位域的注意事项

  1. 位域类型:位域的位数必须是整数类型(int、unsigned int等)或枚举类型。
  2. 内存布局:位域在内存中的布局是与机器相关,在不同的编译器和平台可能会有所不同。
  3. 位域的大小:位域的大小通常受到编译器的限制,不能超过其类型的大小。
  4. 位域的对齐:编译器可能会在位域之间插入填充位,以满足特定的对齐要求。
  5. 位域的取值范围:位域的取值范围受到其占用位数的限制。例如,一个4位的位域的取值范围是0到15,8位的位域取值范围是0到255
  6. 其他:位域字段无法通过 sizeof 进行测量。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant