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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.