Go: Битовые поля и битовая упаковка

Битовые поля языка 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<

.. или что-то в этом роде (для большей формальности взгляните на this )

Итак, вопрос в том, если я хочу "сделать" битовые поля на ходу, как лучше всего это сделать?

8
задан Alexis Wilke 26 August 2019 в 23:20
поделиться