Битовые поля языка 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, v) ((*p)&f)
#define set_field(p, f, v) (*p) = (v<<f) + (*p)&(~f)
...
set_field(&my_chunk, FIELD_A, 12345);
.. или что-то в этом роде (для большей формальности взгляните на this )
Таким образом, вопрос в том, что если я хочу "делать" битовые поля в го, то как лучше всего это сделать?