mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Um 4 nach links schieben


Autor: Johann (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann es schlecht testen. Wird durch die Schiebeoperation das Bit 0 
und 1 mit 0 azfgefüllt?

Autor: Ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dazu sollte jedes gute C Buch Auskunft geben.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Johnny (Gast)
Datum:

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

Autor: Z8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht unter C nicht auch inline ASM?

rol variable

Z8

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> geht unter C nicht auch inline ASM?

Je nach Compiler schon.

Was definitiv nicht geht ist inline C#.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Z8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>aber besser durch den Originalwert
>um 6 nach rechts nur geschoben

what ?????

Versehe ich nicht! Kannst Du das mal bitte erläutern.

Gruß Z8

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Z8 (Gast)
Datum:

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

Autor: 0 ist false, alles andere true - Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Klaus Wachtler: Bist Du der (http://www.wachtler.de/ck/) Klaus 
Wachtler?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja

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.