www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schieben in Arrays


Autor: JostA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: asm (Gast)
Datum:

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

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

Autor: JostA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
werte[2] <<= 1;
if( werte[1] & 0x80 )
  werte[2]++;
werte[1] <<= 1;
if( werte[0] & 0x80 )
  werte[1]++;
werte[0] <<= 1;


Peter

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerade eingefallen ...
Noch eine Variante ?

unsigned char *p;

p = (werte + 1);

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

Autor: JostA (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.