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?
am besten gar nicht (über die Grenzen hinaus.. :-) ansonsten Variable = 1 1=2 2=3 3=Variable
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...
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
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.
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)
Gerade eingefallen ... Noch eine Variante ? unsigned char *p; p = (werte + 1); werte[0]= *p; werte[1]= *(p+1); werte[2]= (*(p+2) & 127);
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.