【发布时间】:2011-04-26 16:05:10
【问题描述】:
C 语言的位域提供了一种在结构中定义任意宽度字段的相当方便的方法(暂时不用考虑可移植性的问题。)例如,这是一个带有一对字段和一个“标志”的简单结构:
#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);
.. 或类似的东西(更正式的,请查看this)
所以问题是,如果我想在 go 中“做”位域,这样做的最佳做法是什么?
【问题讨论】:
标签: go bit-fields