Forum: Compiler & IDEs arithmetic shift mit signed variable?


von Schawwi (Gast)


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?

von Falk B. (falk)


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

von Klaus F. (kfalser)


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;

von Rolf Magnus (Gast)


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.

von Schawwi (Gast)


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!

von Benedikt K. (benedikt)


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.

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.