PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rol und ror in C



Richi 007
08.03.2008, 13:30
Gibt es im C eigentlich so Funktionen wie im Assembler(rol und ror)?

izaseba
08.03.2008, 14:20
Wie wäre es mit etwas inline Assembler ?

Beispiel:


asm volatile (

"ldi %2,8" "\n\t"
"0:" "\n\t"
"lsr %0" "\n\t"
"rol __tmp_reg__" "\n\t"
"dec %2" "\n\t"
"brne 0b" "\n\t"
"mov %0,__tmp_reg__" "\n\t"
: "=a" (tmp)
: "0" (tmp), "a" (count)
);

Dreht mit hilfe von rol alle Bits in tmp um, also Bit 0 wird zu 7 1 zu 6 usw.

Gruß Sebastian

Richi 007
08.03.2008, 14:31
Blick ich nicht

fluchtpunkt
08.03.2008, 15:11
wie waers mit


unsigned char ror(unsigned char val, unsigned char places)
{
return (val>>places)|(val<<8-places);
}

unsigned char rol(unsigned char val, unsigned char places)
{
return (val<<places)|(val>>8-places);
}

Je nachdem ob man nun ein char, int oder long rotieren will muss natuerlich die Funktion entsprechend abgeaendert werden.

HTH

izaseba
08.03.2008, 15:51
@fluchtpunkt,
Bist Du sicher, daß Deine Funktionen wirklich rol ror nachbilden ?

Gruß Sebastian

fluchtpunkt
08.03.2008, 16:31
naja nicht ganz, eigentlich ueberhaupt nicht. Naechstes mal les ich vorher was ror und rol eigentlich tut, hatte das anders in Erinnerung :/


EDIT2: Aber eigentlich ist sowas wie rol und ror, exakt so nachgebildet wie in assembler ziemlich sinnlos.

izaseba
08.03.2008, 17:29
Aber eigentlich ist sowas wie rol und ror, exakt so nachgebildet wie in assembler ziemlich sinnlos.

Ja eben ;-)

und wenn überhaupt, dann irgendwie ein Stück von Inlineassembler...

Gruß Sebastian

Richi 007
08.03.2008, 18:42
Ah, weil ich möcht n LED Lauflicht mache und ich bekomm des irgendwie net hin.

izaseba
08.03.2008, 18:53
Ja dann beschreib mal etwas Dein Lauflicht und warum unbedingt rol oder ror helfen soll ;-)

Gruß Sebastian

fluchtpunkt
09.03.2008, 11:21
na wenn du ein lauflicht machen willst bei dem das was links rausfaellt rechts wieder reinkommt dann ist mein Code doch sehr gut geeignet.

man kann sowas natuerlich auch ohne Bitshiftmagie machen.



unsigned char rotate_right(unsigned char pattern)
{
unsigned char add;
if (pattern & 0x01)
add = 0x80;
else
add = 0;
pattern = pattern >> 1;
pattern = pattern | add;
return pattern;
}



Je nachdem wie dein Lauflicht aussieht muss das aber nicht der optimale Weg sein, deswegen ist es immer sehr hilfreich wenn man genau dazu schreibt was man eigentlich machen moechte. Gerade Anfaenger verrennen sich oft in irgendwelche "abstrusen Vorstellungen" :)

Richi 007
10.03.2008, 18:24
Mein Lauflicht besteht aus acht LEDs und möchte einfach z.B. 4 LEDs anschalten und die dann durchlaufen lassen. Und genau wie bei rol und ror soll die ganz linke/rechte LED dann wieder rechts/links auftauchen.

izaseba
10.03.2008, 18:52
Ja dann würde ich vor dem Schieben schauen, was links oder rechts "rausfällt"



if (a&0x80)
a = (a<<1)|0x01;
else
a<<=1;

für links Schieben oder

if (a&0x01)
a = (a>>1)|0x80;
else
a>>=1;

für rechts Schieben.

Gruß Sebastian

Richi 007
10.03.2008, 21:04
Danke, ich werds mal ausprobieren, ich sitz am falschen PC

fluchtpunkt
10.03.2008, 21:34
ich habe das Gefuehl meinen Code mag niemand :-/

Richi 007
13.03.2008, 19:04
ich habe das Gefuehl meinen Code mag niemand :-/
Ich hab deinen Code benutzt, ja!
Und den von izaseba auch.
Es geht, bloß ich hab noch nen Programmfehler, ich dreh immer nach rechts.