C-kod. Bit-hantering. Vad gör koden?

Permalänk

C-kod. Bit-hantering. Vad gör koden?

Begriper inte detta...

Parametern _ucWGM120 är från en enum och satt till värdet 4 i detta fall.

Vad gör modulus-operatorn i praktiken här? Jag kan definitionen för modulus men de använder den här av en anledning och jag är blind idag.
Kan säga att koden är avsedd för en IAR men jag ska porta den till gcc (Atmel studio).
TCCR1B_WGM13 är ett macro kan man säga. WGM13 är en bit i TCCR1B....

void TC1_setWaveformGenerationMode(eTC1_wgm _ucWGM120) { unsigned char ucWGM120 = _ucWGM120; TCCR1B_WGM13 = ucWGM120/8; ucWGM120 = ucWGM120%8; TCCR1B_WGM12 = ucWGM120/4; ucWGM120 = ucWGM120%4; TCCR1A_WGM11 = ucWGM120/2; ucWGM120 = ucWGM120%2; TCCR1A_WGM10 = ucWGM120; }

Permalänk
Medlem

I detta fall, modulus med (positiv) faktor 2, är det inte samma som bitwise and? Dvs % 2 är samma som & 1, osv?

Skickades från m.sweclockers.com

Visa signatur

-- FubbHead

Permalänk
Medlem

Jo.
division med 2-potens == bitvis höger skift
modolus 2-potens == maskning av bitar

Modulus 8, innebär att man tar ut de 3 lägsta bitarna - på ett inneffektict sätt.
Vad koden gör är att den plockar ut enskilda bitar från ingångsparametern

TCCR1A_WGM10 <= bit 0 av _ucWGM120
TCCR1A_WGM11 <= bit 1 av _ucWGM120
TCCR1B_WGM12 <= bit 2 av _ucWGM120
TCCR1B_WGM13 <= bit 3-7 av _ucWGM120

Permalänk
Hedersmedlem
Skrivet av Erik_T:

Modulus 8, innebär att man tar ut de 3 lägsta bitarna - på ett inneffektict sätt.

I teorin, ja, men kompilatorer är rätt duktiga på att inse att det går att förbättra. Efter optimering blir nog resultatet identiskt.

Edit: Compiler explorer är trevligt om man vill experimentera:

Permalänk

Idiotisk kommentar har tagits bort av mig själv.