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?
@ 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
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;
> 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.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.