[elektro] C kérdés

potyo potyo.ada at gmail.com
Wed Sep 23 15:55:59 CEST 2009


2009/9/23 Palasik Sandor <palasik at mail.datanet.hu>

> > 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))))
>
> Köszönöm, működik.

> >
> > #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.
>
> Igen, egy zárójel rossz helyre került. Köszönöm az észrevételt.

> Palasik Sándor
>
> -----------------------------------------
>          elektro[-flame|-etc]


More information about the Elektro mailing list