Am häufigsten wird der Modulo-Operator %
verwendet, um gegen eine gerade oder ungerade Zahl zu testen.
Jetzt ist meine Frage, gibt es irgendein Problem, das gegen eine ungerade Zahl prüft, die ein bitweises AND verwendet, weil es sich viel natürlicher fühlt, ob das rechteste Bit 1
oder 0
ist, als eine Modulo-Prüfung gegen 2
Und da die 32-Bit-Konvertierung das am weitesten rechts liegende Bit nicht ändert.
Beide
(1 + Math.pow(2,52)) & 1 //1
und
(1 + Math.pow(2,52)) % 2 //1
ergibt das gleiche Ergebnis.
Gibt es einen Grund, den Modulo-Operator gegenüber dem bitweisen vorzuziehen?
Bearbeiten:
Diese Frage berücksichtigt nur Werte, die in den Bereich der 64-Bit-Genauigkeit fallen
Da nur gerade Zahlen über 2 ^ 53 präzise dargestellt werden können, schlagen beide Operanden fehl ( 9007199254740993 % 2 //0)
In JavaScript bewirkt die Verwendung eines beliebigen bitweisen Operators, dass die Zahl zuerst auf eine 32-Bit-Ganzzahl abgeschnitten wird. Das bedeutet, dass es für einige größere Werte nicht funktioniert. (Nun, einige größere Werte: -)
Der Operator %
macht das nicht.
edit - hey, all die netten Leute, die mich aufgeputscht haben: halt deine Pferde :-) C5H8NNaO4 weist darauf hin, dass der Integer-Trunkierungsprozess das Low-Bit beibehalten sollte, was intuitiv sinnvoll ist, wenn man daran denkt, einfach den oberen Teil der Mantisse abzureißen, und tatsächlich deuten einige oberflächliche "Tests" darauf hin, dass es gut zu funktionieren scheint.
Die Dinge werden natürlich komplizierter für wirklich große Werte, die, wenn sie in ungenauen Gleitkommazahlen dargestellt werden, entweder ungerade oder gerade sein können, da die niedrigstwertigen Stellen fehlen. Mit anderen Worten, wenn der binäre Exponent in einem Gleitkommawert zu einem effektiven Wert führt, der größer ist als die Mantissenkapazität (53 Bits, denke ich), dann müssen Sie entweder alle diese Zahlen sogar berücksichtigen (weil die niedrigen Bits immer Null sind). oder sonst müssen Sie die Frage unbestimmt betrachten.
Es sollte klar sein, dass ich kein Mathematiker bin.
Wenn Ihre Zahlen immer schön in ein 32-Bit-int konvertiert werden, dann sieht es so aus, als ob Bitwise schneller sein könnte - ich vermute, einige Javascript-Engines können es auf Hardware-bitweise Operationen JIT. Ich habe einen Jsperf konstruiert, um es zu testen:
Ich erhalte sehr variable Ergebnisse bei Firefox 20, manchmal ist das Bitwise etwas schneller, manchmal viel schneller.
Wenn Ihre Zahlen sich gut in 32-Bit-Ints umwandeln lassen oder nicht, dann bleiben Sie bei modulo.
Tags und Links javascript modulo bitwise-and