3

尝试将 UID 生成器从 Javascript 转换为 Ruby,我想了解以下行为。

这行代码

89190868196442450 | 0

会用 javascript

1074708816

在红宝石中

89190868196442450

我完全理解 ruby​​ 行为,因为如果它存在于 hether 操作数中,则按位 OR 运算符会复制一点,但我仍然对 javascript 行为感到困惑。我更深入地研究了 javascript 整数表示,但找不到明确的解释。我找到了这个,但没有完全明白。

二进制的 89190868196442450 是 100111100110111101001111101000000000011101100000101010010 ,这使其长度为 57 位。

谁能给我一个明确的解释或上述结果。我应该对 ruby​​ 代码进行什么操作以确保类似的行为?

4

1 回答 1

3

如果您想用 32 位以上的数字表示数字并在 Javascript 中对它们执行按位运算,最好使用模拟长整数,例如:http://closure-library.googlecode.com/svn/docs/class_goog_math_Long。 .html _

看看这个条目。从技术上讲,Javascript 可以表示 2^53 个整数,但按位运算限制为 32 位。

一个数字可以在不损失精度的情况下达到 JavaScript 的最高整数值是多少?

详细说明,当您执行 89190868196442450 | 时 JS 中发生了什么 0 是 Javascript 采用最低有效的32 位并将它们与 0 进行 ORing,得到 1074708816,而在 Ruby 中,它与所有位进行 ORing。如果出于某种原因你想在 Ruby 中重现它,你可以将你的数字与 1FFFFFFFF 相加,这样你就只在最低有效的 32 位上进行操作,然后将其与 0 相或(除了会给你相同的结果之外什么都不做)。

于 2013-02-15T16:30:33.250 回答