Сдвиг битов, маскировка или структура битовых полей?

Я новичок в работе с битами. Я'Я пытаюсь работать с существующим протоколом, который может отправлять три разных типа сообщений.

Тип 1 представляет собой 16-битную структуру:

struct digital 
{
 unsigned int type:2;
 unsigned int highlow:1;
 unsigned int sig1:5;
 unsigned int :1;
 unsigned int sig2:7;
};

Первые два бита (типа, в моей структуре выше) всегда 1 0. Третий бит, highlow, определяет, включен или выключен сигнал, а sig1 + sig2 вместе определяют 12-битный индекс сигнала. Этот индекс разделен между двумя байтами на 0, который всегда находится в бите 7.

Тип 2 - это 32-битная структура. Он имеет 2-битный тип, 10-битный индекс и 16-битное значение, с добавлением 0 's в позициях 27, 23, 15 & 7. Представление структуры битового поля должно выглядеть примерно так:

struct analog 
{
 unsigned int type:2;
 unsigned int val1:2;
 unsigned int :1;
 unsigned int sig1:3;
 unsigned int :1;
 unsigned int sig2:7;
 unsigned int :1;
 unsigned int val2:7;
 unsigned int :1;
 unsigned int val3:7;
};

sig1 & sig2 вместе образуют 10-битный индекс. val1 + val2 + val3 вместе образуют 16-битное значение сигнала с 10-битным индексом.

Если я понимаю, как работать с первыми двумя структурами, я думаю, что смогу понять третью.

У меня вопрос, есть ли способ присвоить единственное значение и заставить программу обрабатывать биты, которые должны входить в val1, val2 и val3? I '

читал о сдвиге битов, структурах битового поля и заполнении 0 's. Структура, кажется, путь, но яЯ не уверен, как это реализовать. Ни один из примеров упаковки битов, которые яМы видели, что есть значения, которые делятся так, как они есть. В конечном счете, яЯ хотел бы иметь возможность создать аналоговую структуру, назначить индекс (i = 252) и значение (v = 32768) и покончить с этим.

Если кто-то может предложить соответствующий метод или предоставить ссылку на подобный образец, яЯ очень ценю это. Если это имеет значение, этот код будет включен в более крупное приложение Objective-C.

Благодарю.

Бради»

Ответы на вопрос(3)

Ваш ответ на вопрос