Hallo,
Man sollte bei solchen Gedanken aber immer auch die Frage nach der zugehörigen Motivation stellen: Warum will da jemand eine offensichtliche Operation (Vergleich) durch eine nicht-offensichtliche Operation (Bitoperator als Ersatz für einen Vergleich) einsetzen?
Die einzige Antwort, die ich an dieser Stelle gelten lassen würde: Performance.
d'accord - aber alle mir bekannten Prozessoren brauchen für einen Integer-Vergleich (8, 16 oder 32bit, je nach Architektur) exakt gleich lange wie für eine logische Operation mit den gleichen Operanden. Es müsste also schon eine sehr spezielle Hardware-Plattform sein, auf der dieses Argument zieht.
Es sei denn, man betrachtet den Vergleich im Zusammenhang mit einer nachfolgenden Operation, bei der man sich im Fall der Identität das Laden der Konstanten 0 in ein Prozessorregister sparen kann.
Tatsächlich nutzen manche x86-Compiler aus, dass diese CPUs interne logische oder arithmetische Operationen wesentlich schneller ausführen können als Speicherzyklen. Sollte ein solcher Compiler also die "Absicht" haben, das Prozessorregister EDX mit dem Wert 0 zu laden, wird er nicht die Instruktion
MOV EDX, 0x00000000
erzeugen, sondern wahrscheinlich eher
XOR EDX, EDX
Denn diese Instruktion braucht nicht nur weniger Bytes im Code (beide Operanden sind Register, ihre "Adresse" ist implizit im Opcode enthalten), sondern wird deswegen auch schneller ausgeführt (weniger Lesezyklen), sofern der Code nicht schon im Cache ist.
Wobei derjenige auch dafür erst den Beweis antreten muss, indem er den tatsächlich generierten Bytecode des Compilers für beide Varianten analysiert und anhand von Taktzyklen für jedes denkbare Input-Szenario beweist, dass die eine Variante besser ist, als die andere.
Ich fürchte, den wird uns derjenige schuldig bleiben (müssen).
Ciao,
Martin
Liebet eure Feinde - vielleicht schadet das ihrem Ruf.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(