Упаковка и распаковка битов.
- Войдите на сайт для отправки комментариев
Ср, 14/01/2015 - 21:03
Решил создать такую тему так как кроме битовых сдвигов ничего не нашел в инете.
например
int i = 255;
как мне распаковать 255 на 8 boolean тегов?
boolean a; boolean b; boolean c; boolean d; boolean e; boolean f; boolean g; boolean h;
и нужна обратная операция. упаковывать boolean тегов в int.
Вы сначала скажите какую задачу хотите решить
не понимая задачи не возможно предложить верное решение
bitRead()
bitWrite()
такое побитовое общение нужна по I2C (Master & Slave). состояние 8 входов slave упаковывается с boolean в int и подается в master.
а в master-e распаковывается.
А что не так с предложением от std?
А что не так с предложением от std?
нормально, но есть и удобнее способ именно под задачу ТС:
А есть способ эффективнее, но менее удобнее (я предположил, что h - самый старший бит, a - младший):
но если ТС планировал просто таким образом сократить затраты оперативной памяти, то это решение было бы ошибочным, потому как упаковка и распаковка стоит довольно дорого, потребляя много флэш. Лучше сэкономить память на других переменных за счет флэш.
2axill Вы предложили правильное решение. Только в битовых полях не используются типы кроме signed, unsigned. Причем 1-но битовое поле всегда unsigned. И еще 1-но битовое поле не может быть = 2.
i.bit.a=1;
i.bit.b=1;
в этом случае i.pack = 3;
2-ка это опечатка, вы правы. Откуда информация про то, что битовые поля обязаны быть только signed/unsigned? Не помню такого в спецификации
http://www.c-cpp.ru/books/bitovye-polya
Видел там :)
Вообще, просто нет других типов. float не объявиш, объявлять int, long, short, char - безсмысленно, так как это одно итоже просто разного размера, а размер битового поля вы задаете сами. Вот и остается только определится, signed или unsigned.
насколько я понял в расширении С++ которое используется в ардуине нет ограничений на тип полей в битовых структурах. И почему это бессмыслено объявлять другие типы? Очень даже осмысленно. Это удобно с точки зрения читаемости кода. Но конечно это очень накладко с точки зрения ресурсов МК. Код создаваемый при использовании битовых полей существенно больше по размеру чем если ручками применять операции манипуляции с битами.
Так что если хочется уменьшить использование RAM, то применение битовых полей не оправдано, наоборот будет увеличение расхода флэш и RAM. А вот если речь идет о каком-то обмене где разного рода данные пакуются и распакуются в пакеты, то есть два выбора - приментять битовые поля, что позволяет красиво аккуратно писать код или делать все ручками, уменьшая расход ресурсов, но увеличивая риск ошибок при програмировании и усложняя читаемость