Вы знакомы с битовыми полями C ? Вы просто пишете
struct my_bits {
unsigned v1 : 4;
...
};
Имейте в виду, что различные операции с битовыми полями выполняются медленнее, поскольку компилятор должен распаковать их для таких вещей, как сложение. Я предполагаю, что распаковка битового поля будет все же быстрее, чем сама операция сложения, даже если для этого требуется несколько инструкций, но это все еще накладные расходы. Побитовые операции должны оставаться довольно быстрыми. Равенство тоже.
Вы также должны позаботиться о порядке байтов и потоков (подробности см. В статье Википедии, на которую я ссылался, но проблемы вроде бы очевидны). В любом случае, вы должны учиться о порядке байтов, поскольку вы сказали «двоичный протокол» (см. в предыдущих вопросах )