C语言的位域提供了一种相当方便的方法,在结构体内部定义任意宽度的字段(暂且不管可移植性问题)。例如,下面是一个简单的结构体,其中包含一些字段和一个'flag':
#pragma pack(push,1)
struct my_chunk{
unsigned short fieldA: 16;
unsigned short fieldB: 15;
unsigned short fieldC: 1;
};
#pragma pop()
添加#pragma语句可以将该结构打包成32位字(确保指针操作的my_chunk
指针对齐,并节省空间)。
访问每个字段在语法上非常好:
struct my_chunk aChunk;
aChunk.fieldA = 3;
aChunk.fieldB = 2;
aChunk.fieldC = 1;
如果不使用编程语言的帮助,另一种解决方案相当丑陋,几乎变成了汇编代码。例如,一种解决方案是为要访问的每个字段创建位移宏:
#define FIELD_A 0xFF00
#define FIELD_B 0x00FE
#define FIELD_C 0x0001
#define get_field(p, f) ((*p)&f)
#define set_field(p, f, v) (*p) = (v<<f) + (*p)&(~f)
...
set_field(&my_chunk, FIELD_A, 12345);
如果我想在Go语言中使用"位域(bitfields)",最佳实践是什么?大致可以参考这个链接(更正式的说法)。