21 Stimmen

Würden Sie num%2 oder num&1 verwenden, um zu prüfen, ob eine Zahl gerade ist?

Nun, es gibt mindestens zwei einfache Möglichkeiten, um festzustellen, ob eine bestimmte Zahl gerade ist oder nicht:

 1. if (num%2 == 0) { /* even */ } 
 2. if ((num&1) == 0) { /* even */ }

Ich halte die zweite Option für weitaus eleganter und sinnvoller und verwende sie daher in der Regel. Aber es ist nicht nur eine Frage des Geschmacks; die tatsächliche Leistung kann variieren: Normalerweise sind die bitweisen Operationen (wie die logial-and hier) viel effizienter als eine mod (oder div) Operation. Natürlich kann man argumentieren, dass einige Compiler dies ohnehin optimieren können, und ich stimme dem zu... aber einige werden es nicht tun.

Ein weiterer Punkt ist, dass der zweite Punkt für weniger erfahrene Programmierer etwas schwieriger zu verstehen sein könnte. Darauf würde ich antworten, dass es wahrscheinlich nur für alle von Vorteil ist, wenn diese Programmierer sich die kurze Zeit nehmen, um diese Art von Anweisungen zu verstehen.

Was meinen Sie dazu?

Die beiden angegebenen Ausschnitte sind nur korrekt, wenn num ist entweder ein vorzeichenloser int oder eine negative Zahl mit Zweierkomplement-Darstellung. - Wie einige Kommentare richtig feststellen.

0voto

Frunsi Punkte 7019

Ich glaube nicht, dass das Modulo die Lesbarkeit verbessert. Beide sind sinnvoll, und beide Versionen sind korrekt. Und da Computer Zahlen binär speichern, können Sie einfach die binäre Version verwenden.

~~

Der Compiler kann die modulo-Version durch eine effiziente Version ersetzen. Aber das klingt wie eine Ausrede für die Bevorzugung der Modulo-Version.

Und die Lesbarkeit ist in diesem speziellen Fall bei beiden Versionen gleich gut. Ein Leser, der neu in der Programmierung ist, weiß vielleicht nicht einmal, dass man modulo 2 verwenden kann, um die Geradzahligkeit einer Zahl zu bestimmen. Der Leser muss es sich selbst erschließen. Er kennen vielleicht nicht einmal den Modulo-Operator !

Es könnte sogar einfacher sein, die binäre Version zu lesen, wenn man die Bedeutung hinter den Aussagen ableiten will:

if( ( num & 1 ) == 0 ) { /* even */ }
if( ( 00010111b & 1 ) == 0 ) { /* even */ }
if( ( 00010110b & 1 ) == 0 ) { /* odd */ }

(Ich habe das "b" Suffix nur zur Verdeutlichung verwendet, es ist nicht C/C++)

Bei der Modulo-Version müssen Sie überprüfen, wie die Operation in ihren Details definiert ist (z. B. in der Dokumentation nachsehen, ob 0 % 2 ist das, was Sie erwarten).

Das Binärsystem AND ist einfacher und es gibt keine Zweideutigkeiten!

~~

Nur der Vorrang der Operatoren kann bei binären Operatoren eine Falle sein. Aber das sollte kein Grund sein, sie zu vermeiden (eines Tages werden auch neue Programmierer sie sowieso brauchen).

-2voto

A. Walton Punkte 7

An dieser Stelle mache ich vielleicht nur ein bisschen mehr Lärm, aber was die Lesbarkeit angeht, ist die Modulo-Option sinnvoller. Wenn Ihr Code nicht lesbar ist, ist er praktisch nutzlos.

Wenn es sich nicht um Code handelt, der auf einem System ausgeführt werden soll, das wirklich knapp an Ressourcen ist (ich denke da an einen Mikrocontroller), sollten Sie nicht versuchen, für den Optimierer des Compilers zu 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