![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
Задача: предположим, что вам надо отправить по ком-порту 8 состояний булевого типа...
Как решает эту задачу человек, незнакомый с битовыми полями... struct BooleanReal { bool Switch1; bool Switch2; bool Switch3; bool Switch4; bool Switch5; bool Switch6; bool Switch7; bool Switch8; }; BooleanReal br; FillStruct (&br); SendStruct (&br); И какой результат работы? мы отправили ЦЕЛЫХ ВОСЕМЬ байт... Не порядок...использовать целый байт для значения 1 или 0... Что же делать? -Использовать битовое поле! struct Boolean { bool Switch1 : 1; //0 >= Switch <= 1 0..1 bool Switch2 : 1; bool Switch3 : 1; bool Switch4 : 1; bool Switch5 : 1; bool Switch6 : 1; bool Switch7 : 1; bool Switch8 : 1; }; В этой структуре каждое поле имеет размеронсть в 1 бит. В результате sizeof(Boolean) будет равен 1 байту. Но как быть, если надо передать не 1 или 0? struct BitTest { unsigned short Bit1 : 4; //0 >= Bit < 16 0..15 unsigned short Bit2 : 4; //0 >= Bit < 16 0..15 unsigned short Bit3 : 4; //0 >= Bit < 16 0..15 unsigned short Bit4 : 4; //0 >= Bit < 16 0..15 }; Эта структура будет занимать 2 байта, и мы можем в ней хранить 4 поля размером в 0xF. Т.е. максимальное значение каждой переменной будет 15. Это становитя неудобным, если надо передавать большие значения, но для маленьких - это незаменимо + еще с помощь этого можно просто извлекать биты из переменной и записывать их обратно. -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Я не совсем понял, что ты хотел иметь ввиду, но подозреваю, что тебе нужен union
|
|||
|
||||
| FdX |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 13.8.2002 Репутация: нет Всего: нет |
Все правильно. Он не спрашивал, а рассказывал о такой удобной вещи в С++ - Битовых полях. Позволяет сильно экономить память, отведенную под данные, если там используется много значений типа bool. А вот на счет кода - не знаю. Помойму код для работы с ними получается довольно большой и медленно пашет. Union - это совсем другое. Он представляет собой частный случай структуры, все поля которой располагаются по одному адресу. Но это уже оффтопик пошел. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |