Forum: Mikrocontroller und Digitale Elektronik Schieben in Arrays


von JostA (Gast)


Lesenswert?

Ich habe ein Array aus 3 unsigned char Variablen.
unsigned char werte[3];
Nun muss ich alle Werte um eins nach links schieben, aber wie mache ich 
das über die Grenzen des Arrays hinweg?

von asm (Gast)


Lesenswert?

am besten gar nicht (über die Grenzen hinaus.. :-) ansonsten

Variable = 1
1=2
2=3
3=Variable

von JostA (Gast)


Lesenswert?

Oh, ich hab mich falsch ausgedrückt, das ganze ist noch komplizierter, 
ich muss Bitweise scheieben.
Ich hab mir auch schon Überlegt das ganze nach unsigned long zu 
konvertieren, dann zu schieben, und wieder zurück, aber das dauert ja 
auch lange...

von Peter D. (peda)


Lesenswert?

1
werte[2] <<= 1;
2
if( werte[1] & 0x80 )
3
  werte[2]++;
4
werte[1] <<= 1;
5
if( werte[0] & 0x80 )
6
  werte[1]++;
7
werte[0] <<= 1;


Peter

von Benedikt K. (benedikt)


Lesenswert?

Oder eben doch über eine Union als long.
Dann sind 3 Takte notwendig (lsl, rol, rol). OK, der Compiler wird 4 
daraus machen, aber das ist trotzdem schneller als die anderen Lösungen.
Dazu kommt halt noch das Laden/Zurückschreiben in den Speicher.

von Chris (Gast)


Lesenswert?

Hab jetzt nicht so die riesen Erfahrung aber sowas in der Richtung 
vielleicht:

werte[0]= ((werte[0] << 1) | ((werte[1] & 128) >> 7 ));
werte[1]= ((werte[1] << 1) | ((werte[2] & 128) >> 7 ));
werte[2]= (werte[2] << 1)

von Chris (Gast)


Lesenswert?

Gerade eingefallen ...
Noch eine Variante ?

unsigned char *p;

p = (werte + 1);

werte[0]= *p;
werte[1]= *(p+1);
werte[2]= (*(p+2) & 127);

von JostA (Gast)


Lesenswert?

Die union Sache hatte ich auch schon probiert, das geht solange es drei 
Werte sind. Aber was bei 10, oder gar hundert?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.