Hallo Martin,
Eine Negation ist bei vielen CPUs in nur einem einzigen Taktzyklus erledigt. Die Subtraktion braucht mindestens einen Zyklus länger, weil noch ein Operand geholt werden muss
Den Operand hat Gunnar auch, für das AND. Dass seine Version die lesbarste ist, will ich gar nicht bestreiten.
Was beim Assemblieren wirklich stört, ist das Temp-Register, das meine Version braucht, weil ich den Wert von einer Konstanten abziehe.
Aber, was dann wieder unterging, war die XOR Version: value ^ 65535. Die lässt sich in einer Instruktion realisieren, je nach verwendetem Transistorenhaufen sogar ohne Register.
Es gibt eine Menge Wege, unter Ausnutzung der Werterepräsentation Bitoperationen ohne Bitoperatoren durchzuführen.
Zyklen zu zählen ist auf modernen Prozessoren aber zumeist sinnlos. Die Pipelines und Caches haben massiven Einfluss auf den Ablauf. Deswegen produzieren die Intel-Compiler auch massiv schnelleren Code als beispielsweise die Microsoft-Compiler.
Wie gut die Optimizer von V8 oder Spidermonkey sind, weiß man auch nicht. Oder? Jedenfalls ist C# bei mir eher schneller als JavaScript, und C++ noch sehr viel mehr.
Rolf
sumpsi - posui - obstruxi