6
votes

Opérations de 48 bits Bitwise en JavaScript?

On m'a donné la tâche de porter le java.util.random () à JavaScript, et j'ai coulé sur une énorme performance Hit / inaccracy à l'aide des opérateurs Bitwise en JavaScript sur suffisamment grand Nombres. Certaines recherches superficielles indiquent que "les opérateurs bitwises en JavaScript sont inhérents", car à l'interne, il apparaît que JavaScript lancera toutes ses valeurs doubles dans des entiers 32 bits signés pour effectuer les opérations bitwises ( voir ici pour plus d'informations sur ceci.) À cause de cela, je ne peux pas faire un port direct du numéro aléatoire Java générateur, et j'ai besoin d'obtenir les mêmes résultats numériques que java.util.random () . Écrire quelque chose comme xxx

(qui est un port presque direct du code java.util.random () ) ne fonctionnera pas correctement, car JavaScript peut ' Les opérations bitwises sur un entier de cette taille.)

J'ai compris que je peux simplement créer un générateur de nombres aléatoires semisable dans un espace 32 bits à l'aide de l'algorithme de Léhmer, mais l'astuce est que j'ai besoin que j'ai besoin Pour obtenir les mêmes valeurs que je le ferais avec java.util.random () . Que dois-je faire pour faire un port fonctionnel plus rapide?


0 commentaires

4 Réponses :


0
votes

Les opérations bits 48 bits ne sont pas possibles dans JavaScript. Vous pouvez utiliser deux chiffres pour simuler cependant.


0 commentaires

0
votes

Une alternative consiste à utiliser un réseau booléen de 48 booléens et à mettre en œuvre le changement de vitesse. Je ne sais pas si cela est plus rapide, cependant; Mais j'en doute, car tous les booléens sont stockés comme doubles.


0 commentaires

0
votes

Gardez à l'esprit qu'un changement de bit est directement équivalent à une multiplication ou de division par une puissance de 2.

1 << x == 1 * Math.pow(2,x)


0 commentaires

4
votes

au lieu de foo & ((((1 << 48) - 1) Vous devriez pouvoir utiliser foo% math.pow (2,48) .

Tous les numéros en JavaScript sont des numéros de points flottants de 64 bits, qui suffit à représenter tout entier de 48 bits.


0 commentaires