union Test
{
struct
{
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
}bits;
short int value;
}tzt;
tzt.value=0xFA;
Вложенные структуры
Применяется для быстрого чтения/записи двубайтового регистра.
Код:
Тут возникает вопрос. Так ли уж обязательно указывать тип вложенной структуре, если она существует только в единственном экземпляре в рамках внешней структуры?
В приведенном выше примере, у структуры содержащей битовые поля не объявлено имя типа. Насколько это корректно? С одной стороны, подтверждений правильности подобного написания я не нашел. А с другой стороны, какой смысл плодить лишние имена...
Кстати, насколько гарантировано то, что битовые поля структуры будут храниться в байте в том порядке в котором они объявлены?
Т.е. насколько корректно вообще подобное преобразование данных через union?
2. "Преобразование типов" через union также вполне корректно, и часто практикуется (по крайней мере, практиковалось). Правда, есть определенные ограничения на использование объединений, связанных, например, с деструкторами. В данном случае проблем нет.
3. Битовые поля, насколько мне известно, хранятся именно в том порядке, в каком объявлены.
4. В качестве альтернативного варианта можно предложить не объявлять вложенную структуру вообще, сам union заменить, скажем, на структуру или класс, short int value оставить, а для доступа к битам перегрузить оператор [].
Примерный код:
Код:
class Test
{
public:
const short int get_byte ()
{
return value;
};
const short int operator [] (size_t index)
{
// Можно вставить проверку на то, чтобы index не превышал 7
return (value >> index) & 1;
};
private:
short int value;
}
{
public:
const short int get_byte ()
{
return value;
};
const short int operator [] (size_t index)
{
// Можно вставить проверку на то, чтобы index не превышал 7
return (value >> index) & 1;
};
private:
short int value;
}
Для доступа к отдельным битам можно рекомендовать bitset:
#include <bitset>
...
bitset<8> bits; // Восемь бит
Это зависит от используемого языка - С или С++.