Welche der folgenden Techniken ist die beste Möglichkeit, eine ganze Zahl durch 2 zu teilen, und warum?
Technik 1:
x = x >> 1;
Technik 2:
x = x / 2;
Hier x
ist eine ganze Zahl.
Welche der folgenden Techniken ist die beste Möglichkeit, eine ganze Zahl durch 2 zu teilen, und warum?
Technik 1:
x = x >> 1;
Technik 2:
x = x / 2;
Hier x
ist eine ganze Zahl.
Verwenden Sie den Vorgang, der am besten beschreibt, was Sie zu tun versuchen.
Beachten Sie, dass sie nicht genau gleichwertig sind. Sie können für negative ganze Zahlen unterschiedliche Ergebnisse liefern. Zum Beispiel:
-5 / 2 = -2
-5 >> 1 = -3
Es gibt so viele Gründe, die für die Verwendung von x = x / 2;
Hier sind einige:
es drückt Ihre Absicht deutlicher aus (vorausgesetzt, Sie haben es nicht mit Bit-verdreherischen Registerbits oder so zu tun)
der Compiler reduziert dies ohnehin auf eine Schiebeoperation
selbst wenn der Compiler sie nicht reduziert und eine langsamere Operation als die Verschiebung gewählt hat, ist die Wahrscheinlichkeit, dass dies die Leistung Ihres Programms messbar beeinträchtigt, verschwindend gering (und wenn sie messbar beeinträchtigt wird, haben Sie einen echten Grund, eine Verschiebung zu verwenden)
Wenn die Division Teil eines größeren Ausdrucks sein soll, ist es wahrscheinlicher, dass Sie den Vorrang richtig setzen, wenn Sie den Divisionsoperator verwenden:
x = x / 2 + 5;
x = x >> 1 + 5; // not the same as above
Vorzeichenbehaftete Arithmetik könnte die Dinge noch komplizierter machen als das oben erwähnte Problem der Vorrangigkeit
um es noch einmal zu wiederholen - der Compiler wird dies ohnehin für Sie tun. Tatsächlich wandelt er die Division durch eine Konstante in eine Reihe von Verschiebungen, Additionen und Multiplikationen für alle Arten von Zahlen um, nicht nur für Zweierpotenzen. Siehe diese Frage für Links zu noch mehr Informationen über dieses Thema.
Kurz gesagt, man erkauft sich nichts, wenn man eine Verschiebung kodiert, wenn man eigentlich multiplizieren oder dividieren will, außer vielleicht einer erhöhten Wahrscheinlichkeit, einen Fehler einzuführen. Es ist eine Ewigkeit her, dass Compiler nicht klug genug waren, diese Art von Dingen auf eine Verschiebung zu optimieren, wenn es angebracht war.
Welche ist die beste Option und warum für die Division einer ganzen Zahl durch 2?
Das hängt davon ab, was Sie meinen mit am besten .
Wenn Sie wollen, dass Ihre Kollegen Sie hassen oder dass Ihr Code schwer zu lesen ist, würde ich mich für die erste Option entscheiden.
Wenn du eine Zahl durch 2 teilen willst, nimmst du die zweite Zahl.
Die beiden sind nicht gleichwertig, sie verhalten sich nicht gleich, wenn die Zahl negativ ist oder innerhalb größerer Ausdrücke - bitshift hat einen niedrigeren Vorrang als +
または -
hat die Division einen höheren Stellenwert.
Sie sollten Ihren Code so schreiben, dass er seine Absicht zum Ausdruck bringt. Wenn es Ihnen um die Leistung geht, machen Sie sich keine Sorgen, der Optimierer leistet bei dieser Art von Mikrooptimierungen gute Arbeit.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.