Christian Seiler: Wie bestimme ich ob eine Zahl gerade oder ungerade ist?

Beitrag lesen

Hallo,

if ($zahl%2==0) {echo "Die Zahl ist gerade";}
else {echo "Die Zahl ist ungerade";}

if (!($zahl & 1)) {echo "Die Zahl ist gerade";}
else {echo "Die Zahl ist ungerade";}

Dürfte performanter sein. Erklärung:

Eine Integer-Zahl wird binär gespeichert. Bsp:

1 = 0 0 0 0 0 0 0 1
2 = 0 0 0 0 0 0 1 0
3 = 0 0 0 0 0 0 1 1
4 = 0 0 0 0 0 1 0 0
5 = 0 0 0 0 0 1 0 1
6 = 0 0 0 0 0 1 1 0
7 = 0 0 0 0 0 1 1 1

usw.usf.

Dabei fällt auf, dass *immer* das letzte Bit gesetzt ist, wenn die Zahl ungerade ist (ist ja auch logisch, das letzte Bit legt ja fest, ob 2^0 = 1 in der Zahl enthalten ist, oder nicht).

Wenn man nun mit zwei Zahlen ein logisches Und (&) durchführt, dann passiert folgendes: Die Zahlen werden sozusagen bitweise untereinander geschrieben und überall dort, wo beide Zahlen ein 1-Bit haben, wird das resultierende Bit 1, sonst 0.

Bsp:

0 0 0 0 0 1 1 0
UND 0 0 1 0 1 0 1 0
    ---------------
    0 0 0 0 0 0 1 0

Die Zahl 1 enthält nur ein gesetztes Bit, nämlich genau das letzte. Wenn wir also die 1 mit einer beliebigen Zahl UND-Verknüpfen, dann kann entweder 0 oder 1 herauskommen, je nachdem, ob die Zahl, mit der wir die 1 verknüpfen, das letzte Bit gesetzt hat. Da die 1 alle anderen Bits nicht gesetzt hat, sind alle anderen Bits automatisch 0. Und da das letzte Bit darüber entscheidet, ob eine Zahl gerade ist, oder nicht, kann man diese UND-Verknüpfung verwenden, um festzustellen, ob eine Zahl gerade ist, oder nicht.

Bsp:

8 UND 1 = 0                 17 UND 1 = 1

0 0 0 0 1 0 0 0             0 0 0 1 0 0 0 1
UND 0 0 0 0 0 0 0 1         UND 0 0 0 0 0 0 0 1
    ---------------             ---------------
    0 0 0 0 0 0 0 0             0 0 0 0 0 0 0 1

=> gerade                   => ungerade

Jetzt zur Performance der Geschichte:

Eine UND-Vernküpfung ist eine elementare Verknüpfung, die ein Prozessor mit 2 Zahlen anstellen kann - viele andere Verknüpfungen werden mit UND-Verknüpfungen nachgebaut. UND ist schnell, UND ist einfach. Ich weiß jetzt zwar nicht konkret, wie Modulo in Prozessoren implementiert ist, aber es wird auf jeden Fall langsamer sein, als UND, da Modulo eben komplizierter und nicht so elementar ist, wie UND.

Fazit: wer *sehr* häufig (z.B. in einer Schleife mit extrem vielen Durchgängen) ermitteln will, ob eine Zahl gerade oder ungerade ist, sollte auf Modulo verzichten. Bei wenigen Ausführungen fällt es aber nicht ins Gewicht.

Viele Grüße,
Christian

PS: Die Erklärung ist hauptsächlich fürs Archiv.