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.
Die Antwort auf diese Frage hängt von der Umgebung ab, in der Sie arbeiten.
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.x >>= 1
mit einem Kommentar, in dem die Gründe dafür erläutert werden, ist wahrscheinlich am besten, um den Zweck zu verdeutlichen.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.
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.
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 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.