结构体中的位字段的类型为整形,接下来是冒号,冒号后面是一个数字,它指定使用的位数,可以使用
没有名称的字段来提供间距。每个成员都被称为位字段,位字段通过一个结构声明来建立,该结构声明
每个字段提供标签,并确定该字段的宽度。
如:
struct Data1
{
unsigned int bit0 : 1;
unsigned int bit1 : 3;
unsigned int bit2 : 6;
unsigned int bit3 : 22;
};
其中bit0占了1个位;
bit1占了3个位;
bit2占了6个位;
bit3占了22个位;
实际上这个结构体的大小是四个字节32位的长度,也就是1个in类型的长度
示例源码:
// Len_StructBit.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
#include <fstream>
struct Data1
{
unsigned int bit0 : 1;
unsigned int bit1 : 3;
unsigned int bit2 : 6;
unsigned int bit3 : 22;
};
struct Data2
{
unsigned int bit0 : 1;
unsigned int bit1 : 3;
unsigned int bit2 : 6;
unsigned int bit3 : 23;
};
int main()
{
std::cout << "\n\tData1=" << sizeof(Data1) << endl;
std::cout << "\n\tData2=" << sizeof(Data2) << endl;
}
结果分析:
结构体中位字段值可单独读出,也可组合到int类型中。
位字段单独读出的时候,要注意其占的位的个数。
组合到int类型中的时候要注意组合是的移位操作。
示例源码:
// Len_StructBit.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
#include <fstream>
struct Data1
{
unsigned int bit0 : 1;
unsigned int bit1 : 3;
unsigned int bit2 : 6;
unsigned int bit3 : 22;
};
int main()
{
Data1 d1;
d1.bit0 = 0x1;
d1.bit1 = 0x4;
d1.bit2 = 0x21;
d1.bit3 = 0x200001;
unsigned int uData = 0;
uData = uData | (d1.bit0 << 31);
uData = uData | (d1.bit1 << 28);
uData = uData | (d1.bit2 << 22);
uData = uData | (d1.bit3);
cout << hex << "uData=" << uData << endl;
}
执行结果
结构体中的位字段的赋值。
结构体中的位字段可以单独赋值,但是赋值不能大于位字段的大小,否则多出的高位无效。
也可以从整数中,提取相应的位。
示例源码:
// Len_StructBit.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
#include <fstream>
struct Data1
{
unsigned int bit0 : 1;
unsigned int bit1 : 3;
unsigned int bit2 : 6;
unsigned int bit3 : 22;
};
int main()
{
unsigned int uSrcData = 0x12345678;
cout << hex << "\n\nuSrcData = 0x" << uSrcData << endl;
Data1 d2;
d2.bit0 = uSrcData >> 31;
d2.bit1 = (uSrcData >> 28);
d2.bit2 = (uSrcData >> 22);
d2.bit3 = (uSrcData);
cout << hex << "bit0 = 0x" << d2.bit0 << endl;
cout << hex << "bit1 = 0x" << d2.bit1 << endl;
cout << hex << "bit2 = 0x" << d2.bit2 << endl;
cout << hex << "bit3 = 0x" << d2.bit3 << endl;
}
执行结果: