mikrocontroller.net

Forum: Compiler & IDEs arithmetic shift mit signed variable?


Autor: Schawwi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte eine signed long Varibale durch 8192 teilen. Dies würde ja 
bei einer unsigned Variable einem Rechtsshift um 13 Stellen entsprechen. 
Für eine signed Variable bönitige ich aber ja einen arithmetischen 
Shift, statt einem logischen Shift. Demzufolge kann ich nicht den 
>>-Operand benutzen, weil bei der Zweierkomplementdarstellung dadurch 
Blödsinn entsteht.

Wie kann ich aber dennnoch die Zahl mit Hilfe eines Shifts teilen, um 
die operation schnell zu machen?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Schawwi (Gast)

> Shift, statt einem logischen Shift. Demzufolge kann ich nicht den
> >>-Operand benutzen, weil bei der Zweierkomplementdarstellung dadurch
> Blödsinn entsteht.

Wer sagt das? AFAIK sollte der Compiler bei vorzeichenbehafteten 
Variablen korrekt arithmetisch Rechtsschieben, und eben nicht logisch.

>Wie kann ich aber dennnoch die Zahl mit Hilfe eines Shifts teilen, um
>die operation schnell zu machen?

1.) Probieren ob der Compiler das selber richtig macht?
2.) Fallunterscheidung mit if, schieben und anschliessender Korrektur.

MFG
Falk

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob das Vorzeichenbit nachgeschoben wird, hängt vom Compiler ab,
vielleicht passt es ja schon.

Ansonsten kann man bei negativen Werten die Vorzeichenbits dazu-odern :

if (zahl < 0)
   result |= 0xFFF80000UL;

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie kann ich aber dennnoch die Zahl mit Hilfe eines Shifts teilen, um
> die operation schnell zu machen?

Das Progamm hat sich also als zu langsam erwiesen, und du hast 
herausgefunden, daß das an der Division liegt? Dann mußt du evtl. etwas 
mit den Optimierungseinstellungen spielen. Der Compiler sollte 
eigentlich intern die effizienteste Berechnung daraus machen, und wenn 
das bei deinem Prozessor ein Bitshift ist, hätte der eigentlich schon 
von selbst verwendet worden sein sollen.

Autor: Schawwi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk!

Tatsache, das gaht ja. Dann muss ich vorher noch irgendwas anderes 
falsch gemacht haben. Das ist ja einfach. :-)
Da frage ich mich, warum der Compiler Konstanten nicht auf 2^x-Zahlen 
untersucht und dann gegenenenfalls durch Shifts die Division erheblich 
beschelunigt...

Danke für die schnelle und gute Antwort!

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schawwi wrote:

> Da frage ich mich, warum der Compiler Konstanten nicht auf 2^x-Zahlen
> untersucht und dann gegenenenfalls durch Shifts die Division erheblich
> beschelunigt...

Das macht er normalerweise auch, es sei denn man stellt auf Codegröße 
optimieren: Ein Aufruf der Divisionsroutien ist kürzer als 10 Shifts + 1 
Byte weglassen.

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.