[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