OR à bit à l'aide de ruby ​​vs javascript

En essayant de convertir un générateur UID de Javascript vers Ruby, je voulais comprendre le comportement suivant.

Cette ligne de code

89190868196442450 | 0 

Donnerait en javascript

 1074708816 

Et en rubis

 89190868196442450 

Je comprends parfaitement le comportement du ruby ​​car l'opérateur Bitwise OU copie un peu s'il existe dans l'opérande eather, mais je suis toujours perplexe en ce qui concerne le comportement de javascript. J'ai examiné plus en profondeur la représentation entière en javascript et je n'ai pas trouvé d'explication claire. J'ai trouvé cela , mais je ne l'ai pas complètement compris.

89190868196442450 en binaire est 100111100110111101001111101000000000011101100000101010010 ce qui en fait une longueur de 57 bits.

Quelqu'un pourrait-il me donner une explication claire ou le résultat ci-dessus. Et quelle opération dois-je faire sur le code ruby ​​pour assurer un comportement similaire?

Si vous souhaitez représenter des nombres avec> 32 bits et effectuer des opérations par bit sur eux en Javascript, vous préférez utiliser un long émulé comme celui-ci: http://closure-library.googlecode.com/svn/docs/class_goog_math_Long. Html .

Jetez un oeil à cette entrée. Techniquement Javascript peut représenter 2 ^ 53 ints, mais les opérations bit-bit sont limitées à 32 bits.

Quelle est la valeur entière la plus élevée du JavaScript qu'un nombre peut dépasser sans perdre de précision?

Pour élaborer, que se passe-t-il dans JS lorsque vous faites 89190868196442450 | 0 est Javascript, prend le moins 32 bits et ORing avec 0, ce qui donne 1074708816, et dans Ruby il est ORing avec tous les bits. Si, pour une raison ou une autre, vous vouliez reproduire cela dans Ruby, vous ET votre numéro avec 1FFFFFFFF, vous ne fonctionnerez que sur les 32 bits les moins significatifs, puis OR par 0 (ce qui ne fait que vous donner le même résultat).