Ihre Schlussfolgerung in Bezug auf die Leistung beruht auf der beliebten falschen Prämisse.
Aus irgendeinem Grund bestehen Sie darauf, die Sprachoperationen in ihre "offensichtlichen" maschinellen Entsprechungen zu übersetzen und auf der Grundlage dieser Übersetzung Schlussfolgerungen über die Leistung zu ziehen. In diesem speziellen Fall sind Sie zu dem Schluss gekommen, dass eine bitweise- und &
der Sprache C++ muss durch eine Software implementiert werden, die bitweise und Maschinenbetrieb, während ein Modulo %
der Vorgang muss in irgendeiner Weise eine Maschine Abteilung , die angeblich langsamer ist. Ein solcher Ansatz ist, wenn überhaupt, nur von sehr begrenztem Nutzen.
Erstens kann ich mir keinen realen C++-Compiler vorstellen, der die Sprachoperationen so "wörtlich" interpretiert, d. h. sie auf die "entsprechenden" Maschinenoperationen abbildet. Das liegt vor allem daran, dass die äquivalenten Maschinenoperationen häufiger, als man denken würde, einfach nicht existieren.
Wenn es um solche grundlegenden Operationen mit einer unmittelbaren Konstante als Operand geht, wird jeder anständige Compiler immer sofort "verstehen", dass sowohl num & 1
y num % 2
für Integral num
tun genau das Gleiche, so dass der Compiler für beide Ausdrücke absolut identischen Code erzeugt. Natürlich wird die Leistung genau gleich sein.
Dies wird übrigens nicht "Optimierung" genannt. Eine Optimierung liegt definitionsgemäß vor, wenn der Compiler beschließt, vom Standardverhalten der abstrakten C++-Maschine abzuweichen, um einen effizienteren Code zu erzeugen (wobei das beobachtbare Verhalten des Programms erhalten bleibt). In diesem Fall gibt es keine Abweichung, d. h. es findet keine Optimierung statt.
Darüber hinaus ist es durchaus möglich, dass auf dem gegebenen Rechner weder das eine noch das andere optimal umgesetzt werden kann bitweise und noch Abteilung sondern eine andere spezielle maschinenspezifische Anweisung. Darüber hinaus ist es durchaus möglich, dass überhaupt keine Anweisung benötigt wird, da die Geradzahligkeit/Ungeradzahligkeit eines bestimmten Wertes durch die Statusflags des Prozessors oder ähnliches "kostenlos" offengelegt werden könnte.
Mit anderen Worten: Das Argument der Effizienz ist nicht stichhaltig.
Zweitens, um auf die ursprüngliche Frage zurückzukommen, ist die bessere Methode zur Bestimmung der Geradheit/Ungeradheit eines Wertes sicherlich die num % 2
Ansatz, da er die geforderte Prüfung wörtlich ("per definitionem") umsetzt und deutlich zum Ausdruck bringt, dass die Prüfung rein mathematisch ist. D.h. er macht deutlich, dass wir uns um die Eigenschaft eines Nummer und nicht über die Eigenschaft seiner Vertretung (wie im Falle von num & 1
Variante).
En num & 1
Variante sollte für Situationen reserviert werden, in denen Sie Zugriff auf die Bits der Wertdarstellung einer Zahl haben möchten. Die Verwendung dieses Codes zur Überprüfung der Geradzahligkeit bzw. Ungeradzahligkeit ist eine höchst fragwürdige Praxis.