Forum: PC-Programmierung Byte Verschiebung


von silvio hartlaub (Gast)


Lesenswert?

Hallo,

wie kann man in einer Schleife innerhalb einer Funktion eine Variable
mit 3 Byte (var3b) um 1 Byte verschieben und ein neues Byte (var1b)
hinzufügen, und im 2. Schritt ab einer variierenden Position ein Byte
auslesen?
(Jeder Buchstabe entspricht ein Bit 0 oder 1, Reihe mit gleichen
Buchstaben entspricht 1 Byte und Daten sollen zwischen Funktionsaufruf
nicht verloren gehen):

Loop1:
AAAAAAAABBBBBBBBCCCCCCCC (var3b - Anfangswert)
BBBBBBBBCCCCCCCC....     (Verschiebung um 1 Byte)
BBBBBBBBCCCCCCCCDDDDDDDD (var3b - hinzufügen von var1b)
Auslesen ab Pos. (z.B.) 7 = BBCCCCCC

Loop2:
BBBBBBBBCCCCCCCCDDDDDDDD (var3b)
CCCCCCCCDDDDDDDD....     (Verschiebung um 1 Byte)
CCCCCCCCDDDDDDDDEEEEEEEE (var3b - hinzufügen von var1b)
Auslesen ab Pos. (z.B.) 4 = CCCCCDDD

Loop3:
…

Funktionsaufruf:
…
static char *var3b="XXX";  //Wert soll in Fkt. erhalten bleiben,
                           //String Definition 3Byte
char var1b, wert;     //char Definition 1 Byte
…
*var3b=(*var3b << 8);     //Verschiebung der Var um 1 Byte
*(var3b+2)=*var1b;     //Hinzufügen des neuen Bytes an leere Pos.
Beim Auslesen von  var3b zeigt sich an dieser Stelle keine Änderung
gegenüber des Ausgangswertes.

wert=(* var3b >> 7);     // Auslesen ab Pos. 7 = BBCCCCCC (Loop1) - in
Ordnung ???

Vielen Dank im Voraus für jeden Tip.

MFG

Silvio

von Rufus T. Firefly (Gast)


Lesenswert?

32-Bit-Variablen verwenden (DWORD). Shift-Operatoren und logische
Operatoren (AND/OR) sollten das Problem lösen.

Nehmen wir mal an, die Anfangswerte sind in einzelnen Byte-Variablen
namens A, B, C und D enthalten (um kompatibel zu Deinem Bit-Beispiel zu
bleiben).

BYTE A;
BYTE B;
BYTE C;

DWORD Variable;
BYTE Ergebnis;

// Startzustand herstellen
Variable = (A << 16) | (B << 8) | C;

// um 8 Bits verschieben
Variable <<= 8;

// Resultat extrahieren (Bits 13..20)
Ergebnis = (Variable >> 13) & 0xFF;


Klar?

von Jürgen Schuhmacher (Gast)


Lesenswert?

Kannst Du die Bytes nicht einfach kopieren?

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.