[elektro] C kérdés
Palasik Sandor
palasik at mail.datanet.hu
Wed Sep 23 15:02:41 CEST 2009
> Kellene csinálni egy makrót egy változó adott bitjének vizsgálatára,
> de minél gyorsabb kellene, hogy legyen, mert sokszor fut le sok darab
> belőle egymás után. A változó 16 bites tipus, az egyszerű if
> (valtozo&(1<<bit)) sajnos nem ad optimális kódot. Ha viszont castolom
> a változót és a megfelelő "részre" használom az &(1<<bit) műveletet,
> akkor már azt kapom, amit szeretnék. Tehát valami ilyesmire lenne
> szükségem:
Mi lenne, ha egyszerűen C feltételes operátort használnál és hagynád, hogy a
C fordíto kioptimalizálja a nem használt ágat. A C18-at nem ismerem, de pl.
a HITECH megcsinálja, konkrétan így próbáltam:
#define bit_test(valtozo,bit) \
(bit >= 8 ? (((unsigned char*)&(valtozo))[1] & (1<<((bit)-8))) \
: (((unsigned char*)&(valtozo))[0] & (1<<(bit))))
>
> #define bit_test(valtozo,bit) (#if (bit>7) (*((unsigned
> char*)((&valtozo)+1))&(1<<(bit-8))) #else (*((unsigned
> char*)valtozo)&(1<<bit)) #endif)
>
Megjegyezném, hogy az ((&valtozo)+1) az nem a változó felső bájtjának, hanem
a következő változó alsó bájtjának a címe. Nem mindegy, hogy hol a cast.
Palasik Sándor
More information about the Elektro
mailing list