Hallo Ich suche nach der Ressourcenschonendsten Methode eine Signed 32Bit Integer-Zahl durch 1024 zu teilen. Shiften geht im two's complement ja leider nur bri Positiven Zahlen. Ich habe nen ARM M0 Prozessor mit Hardware-Multiplier und Barrel-Shifter. im Moment mache ich ne Fallunterscheidung ob die Zahl >=0 ist. Wenn ja Wird geshiftet um 10 Bit, wenn nein wird erst mit -1 multipliziert, dann geshiftet und dann nochmals mit -1 multipliziert. Gibts da noch ne bessere Variante?
Chris schrieb: > Shiften geht im two's complement ja > leider nur bri Positiven Zahlen. Sagt wer? Wenn dein µC einen arithmetischen Shift drauf hat geht's problemlos.
@ Chris (Gast) >Ich suche nach der Ressourcenschonendsten Methode eine Signed 32Bit >Integer-Zahl durch 1024 zu teilen. Shiften geht im two's complement ja >leider nur bri Positiven Zahlen. Nö, Das geht auch mit vorzeichenbehafteten Zahlen. Allerdings ist das glaub ich "implementation definied" oder so. Also muss man ggf. manuell nachhelfen.
1 | int32_t x; |
2 | |
3 | x >>= 10; |
4 | if (x & 0x00200000) x |= 0xFFC00000; // sign extend |
Chris schrieb: > Hallo > > Ich suche nach der Ressourcenschonendsten Methode eine Signed 32Bit > Integer-Zahl durch 1024 zu teilen. Shiften geht im two's complement ja > leider nur bri Positiven Zahlen. > > Ich habe nen ARM M0 Prozessor mit Hardware-Multiplier und > Barrel-Shifter. > > im Moment mache ich ne Fallunterscheidung ob die Zahl >=0 ist. Wenn ja > Wird geshiftet um 10 Bit, wenn nein wird erst mit -1 multipliziert, dann > geshiftet und dann nochmals mit -1 multipliziert. > > Gibts da noch ne bessere Variante? Wie so gut wie alle anderen Controller so kennt auch der Cortex-M0 arithmetische und logische Schiebebefehle: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/BABJCCDH.html http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/CIHDDCIF.html
Vorzeichenbehafteter Shift um 10 ist der halbe Ansatz, wenngleich in C implementation defined. Die vorherige Addition von 1023 bei negativen Werten ist die andere Hälfte.
:
Bearbeitet durch User
Und dann noch bitte der Vergleich der beiden ASM-Listings für die optimierte Version und das einfache Ausschreiben der Division durch eine Konstante.
Walter T. schrieb: > Und dann noch bitte der Vergleich der beiden ASM-Listings Yep, denn der Compiler kennt den Trick natürlich auch.
Schreib doch "/ 1024", der Compiler weiß schon wie man Divisionen zu Shifts optimiert...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.