Um 4 nach links schieben

Gast #1275100
Lesenswert?

Hallo @ all

Ich habe einen Wert vom Datentype unsigned int (16Bit)

diesen möchte ich jetzt um zwei stellen nach links schieben (also mit 4 
multiplizieren)

anschließend möchte ich das Ergebnis in 2 Werte vom Datentye unsigned 
char (8Bit) zerlegen.

hier ist mein Code

unsigned int test = 4096;
unsigned char HIGHBYTE, LOWBYTE;

test = test << 2;

HIGHBYTE = ((unsigned char) ((unsigned int)(neue_spiegelposition)));
LOWBYTE = ((unsigned char) (((unsigned int)(neue_spiegelposition)) >> 8 
));

IST DAS SO RICHTIG?
#1275109
Lesenswert?

Johann schrieb:
> Hallo @ all
>
> Ich habe einen Wert vom Datentype unsigned int (16Bit)
>
> diesen möchte ich jetzt um zwei stellen nach links schieben (also mit 4
> multiplizieren)
>
> anschließend möchte ich das Ergebnis in 2 Werte vom Datentye unsigned
> char (8Bit) zerlegen.
>
> hier ist mein Code
>
> unsigned int test = 4096;
> unsigned char HIGHBYTE, LOWBYTE;
>
> test = test << 2;
>
> HIGHBYTE = ((unsigned char) ((unsigned int)(neue_spiegelposition)));
> LOWBYTE = ((unsigned char) (((unsigned int)(neue_spiegelposition)) >> 8
> ));
>
> IST DAS SO RICHTIG?

Probiers aus.

PS: WEnn du mit 4 multiplizieren willst, dann multiplizier auch mit 4.

   test = test * 4;

Wenn es einfacher ist, das durch eine Schiebeoperation zu ersetzen, dann 
macht das der Compiler für dich.
#1275128
Lesenswert?

Johann schrieb:
> Ich kann es schlecht testen. Wird durch die Schiebeoperation das Bit 0
> und 1 mit 0 azfgefüllt?

Ja. Aber wie gesagt. Darum brauchst du dich nicht kümmern. Wenn du mit 4 
multiplizieren willst, dann schreib das auch so hin und überlass die 
Details dem Compiler.

Kümmere dich lieber darum, warum das High-Byte wohl High-Byte heisst und 
wie man es daher kriegen wird.
Gast #1275135
Lesenswert?

> Wird durch die Schiebeoperation das Bit 0 und 1 mit 0 azfgefüllt?

Ja das ist so, in Deinem Fall wird mit 0 aufgefüllt.

Bei negativen Zahlen und nach rechts schieben wird mit 1 aufgefüllt, 
damit der Wert negativ bleibt, dort also aufpassen.
#1275166
Lesenswert?

Da (m.W. bei AVR zumindest) die Laufzeit beim Schieben mit der Anzahl
der Stellen steigt, um die geschoben wird, wäre es geschickter,
nur den ersten Wert (zwei nach links) so zu gewinnen, den zweiten (2
nach links und wieder 8 nach rechts) aber besser durch den Originalwert
um 6 nach rechts nur geschoben.

Abgesehen davon, daß du test initialisierst und shiftest, aber
dann neue_spiegelposition verwendest...
#1275181
Lesenswert?

Klaus Wachtler schrieb:
> Da (m.W. bei AVR zumindest) die Laufzeit beim Schieben mit der Anzahl
> der Stellen steigt, um die geschoben wird, wäre es geschickter,
> nur den ersten Wert (zwei nach links) so zu gewinnen, den zweiten (2
> nach links und wieder 8 nach rechts) aber besser durch den Originalwert
> um 6 nach rechts nur geschoben.

Das wäre ziemlich kontraproduktiv.
Dein Compiler kennt nämlich einen Trick, wie er Schieben um 8 Stellen 
nach rechts realisiert: Er verwirft einfach das Low-Byte und greift 
direkt auf das High Byte zu.
#1275238
Lesenswert?

@z8:
Anstatt für LOWBYTE den bereits um 2 nach links geshifteten Wert
um 8 nach rechts zu schieben, schlug ich vor, den Originalwert
zu nehmen und nur um 6 nach rechts zu schieben, was auf den
gleichen Wert herauskäme.

@kbuchegg:
Natürlich auch wieder wahr.
Wenn es nach dem Optimieren nicht vielleicht ohnehin aufs
selbe rausläuft...
Gast #1275258
Lesenswert?

; ** mal 2
   LSL VariableLSB  ; 1 Takt Übertrag im C-Flag
   ROL VariableMSB  ; 1 Takt
   ; ** mal 4
   LSL VariableLSB  ; 1 Takt Übertrag im C-Flag
   ROL VariableMSB  ; 1 Takt
                     --------
                     4 Takte

schneller geht es nicht.

Gruß Z8

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