Hallo zusammen,
ich benötige für ein Projekt sehr viele boolsche Flags (>100).
Da ich nicht jeweils ein ganzes Byte verschwenden will organisier ich
das ganze in einem Byte-Array.
Der Zugriff erfolgt mittels Makros, um die dahinter liegende
Datenstruktur zu verbergen.
1 | uint8_t data[10];
|
2 | #define getFlag(number) (((data[number / 8]) & (1 << (number % 8))) >> number)
|
3 |
|
4 | ...
|
5 | void foo()
|
6 | {
|
7 | flag = getFlag(15);
|
8 | }
|
Lesen und Schreiben klappt auch, aber ich finde mein "Lese-Makro"
hässlich. Und außerdem sehr unperformant auf einem ATmega.
For allem die variablen Shifts dürften hässlich werden...
Geht das irgendwie schöner oder performanter?
Was mir spontan einfällt wäre den Ausdruck "(1 << (number % 8))" im
Makro durch einen LookUpTable-Zugriff zu ersetzen (uint8_8 lut[] =
{0x01, 0x02, ...})
Sollte zumindest einen Shift ersparen, kostet dafür 8 Byte.
Wie würdet ihr das lösen?
Viele Grüße,
Ben