416 Stimmen

Welche Option ist besser geeignet, um eine ganze Zahl durch 2 zu dividieren?

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.

855voto

Mark Byers Punkte 761508

Verwenden Sie den Vorgang, der am besten beschreibt, was Sie zu tun versuchen.

  • Wenn Sie die Zahl als eine Folge von Bits behandeln, verwenden Sie bitshift.
  • Wenn es sich um einen numerischen Wert handelt, verwenden Sie die Division.

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

(ideone)

229voto

Cat Plus Plus Punkte 119072

Sieht die erste nach einer Teilung aus? Nein. Wenn Sie dividieren wollen, verwenden Sie x / 2 . Compiler kann es optimieren, um Bit-Shift zu verwenden, wenn es möglich ist (das nennt man Stärke-Reduktion), was es zu einer nutzlosen Mikro-Optimierung macht, wenn man es selbst macht.

190voto

Michael Burr Punkte 320591

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.

62voto

Luchian Grigore Punkte 244505

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.

59voto

justin Punkte 103032

Verwenden Sie einfach divide ( / ), vorausgesetzt, es ist klarer. Der Compiler wird entsprechend optimieren.

CodeJaeger.com

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.

Powered by:

X