Byte Verschiebung

Gast #200452
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
Gast #200453
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren