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.

10voto

Gooner Punkte 371

X = x / 2; ist der geeignete Code zu verwenden.. aber eine Operation hängen von Ihrem eigenen Programm, wie die Ausgabe, die Sie produzieren wollte.

9voto

gkimsey Punkte 499

Die Antwort auf diese Frage hängt von der Umgebung ab, in der Sie arbeiten.

  • Wenn Sie an einem 8-Bit-Mikrocontroller oder einem anderen Gerät ohne Hardware-Unterstützung für die Multiplikation arbeiten, wird Bit-Shifting erwartet und ist alltäglich, und obwohl der Compiler fast sicher die x /= 2 in x >>= 1 Das Vorhandensein eines Divisionssymbols wird in dieser Umgebung mehr Aufsehen erregen als die Verwendung einer Verschiebung zur Durchführung einer Division.
  • Wenn Sie in einer leistungskritischen Umgebung oder einem Codeabschnitt arbeiten, oder wenn Ihr Code mit deaktivierter Compiler-Optimierung kompiliert wurde, x >>= 1 mit einem Kommentar, in dem die Gründe dafür erläutert werden, ist wahrscheinlich am besten, um den Zweck zu verdeutlichen.
  • Wenn auf Sie keine der oben genannten Bedingungen zutrifft, können Sie Ihren Code lesbarer machen, indem Sie einfach x /= 2 . Es ist besser, dem nächsten Programmierer, der sich zufällig Ihren Code ansieht, die 10 Sekunden zu ersparen, in denen er sich über Ihre Verschiebeoperation wundert, als unnötigerweise zu beweisen, dass Sie wussten, dass die Verschiebung ohne Compiler-Optimierung effizienter war.

All dies setzt vorzeichenlose Ganzzahlen voraus. Die einfache Verschiebung ist wahrscheinlich nicht das, was Sie für vorzeichenbehaftete wollen. Außerdem bringt DanielH einen guten Punkt über die Verwendung von x *= 0.5 für bestimmte Sprachen wie ActionScript.

8voto

circusdei Punkte 1927

Mod 2, test for = 1. Ich kenne die Syntax in C nicht, aber das könnte am schnellsten sein.

6voto

Mouna Cheikhna Punkte 36934

Im Allgemeinen teilt die Rechtsverschiebung :

q = i >> n; is the same as: q = i / 2**n;

Dies wird manchmal verwendet, um Programme zu beschleunigen, was auf Kosten der Übersichtlichkeit geht. Ich denke nicht, dass Sie das tun sollten. Der Compiler ist intelligent genug, um die Beschleunigung automatisch durchzuführen. Das bedeutet, dass Wenn Sie eine Schicht einlegen, gewinnen Sie nichts auf Kosten der Klarheit. .

Schauen Sie sich das an Seite aus Praktische C++-Programmierung.

6voto

Chris Bennet Punkte 589

Wenn Sie Ihren Code für den nächsten Leser schreiben, sollten Sie sich für die Klarheit von "x/2" entscheiden.

Wenn Sie jedoch Geschwindigkeit anstreben, sollten Sie beide Möglichkeiten ausprobieren und die Ergebnisse messen. Vor ein paar Monaten habe ich an einer Bitmap-Faltungsroutine gearbeitet, die ein Array von Ganzzahlen durchläuft und jedes Element durch 2 teilt. Ich habe alles Mögliche getan, um es zu optimieren, einschließlich des alten Tricks, "x>>1" durch "x/2" zu ersetzen.

Als ich die Zeitmessung in beide Richtungen vornahm, stellte ich zu meiner Überraschung fest, dass x/2 war schneller als x>>1

Dies war mit Microsoft VS2008 C++ mit den Standard-Optimierungen aktiviert.

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