arithmetic shift mit signed variable?

Gast #668538
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?
#668553
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
Gast #668565
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.
Gast #668571
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!
#668591
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren