Битовые поля языка 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);
.. или примерно так (для большей формальности взгляните на это)
Итак, вопрос в том, если я хочу «делать» битовые поля в go, как лучше всего это сделать?