Forum: Mikrocontroller und Digitale Elektronik Division durch 1024 signed


von Chris (Gast)


Lesenswert?

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?

von Max H. (hartl192)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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

von Arc N. (arc)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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
von Walter T. (nicolas)


Lesenswert?

Und dann noch bitte der Vergleich der beiden ASM-Listings für die 
optimierte Version und das einfache Ausschreiben der Division durch eine 
Konstante.

von (prx) A. K. (prx)


Lesenswert?

Walter T. schrieb:
> Und dann noch bitte der Vergleich der beiden ASM-Listings

Yep, denn der Compiler kennt den Trick natürlich auch.

von Programmierer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.