尝试将 UID 生成器从 Javascript 转换为 Ruby,我想了解以下行为。
这行代码
89190868196442450 | 0
会在 javascript 中给出
1074708816
在 ruby 中
89190868196442450
我完全理解 ruby 的行为,因为如果它存在于 eather 操作数中,则按位或运算符会复制一点,但我仍然对 javascript 的行为感到困惑。 我更深入地研究了 javascript 整数表示,但找不到明确的解释。我 found this , 但没有完全理解。
89190868196442450 在二进制中是 100111100110111101001111101000000000011101100000101010010,这使得它的长度为 57 位。
谁能给我一个明确的解释或上面的结果。我应该对 ruby 代码执行什么操作以确保类似的行为?
最佳答案
如果你想用 > 32 位表示数字并在 Javascript 中对它们执行按位运算,你最好使用像这样的模拟 long:http://closure-library.googlecode.com/svn/docs/class_goog_math_Long.html .
看看这个条目。从技术上讲,Javascript 可以表示 2^53 个整数,但按位运算仅限于 32 位。
What is JavaScript's highest integer value that a Number can go to without losing precision?
详细说明一下,当您执行 89190868196442450 | 时,JS 中发生了什么? 0 是 Javascript 取 least significant 32 位并将它们与 0 进行 OR 运算,得到 1074708816,而在 Ruby 中它与所有位进行 OR 运算。如果出于某种原因你想在 Ruby 中重现它,你可以将你的数字与 1FFFFFFFF 进行运算,这样你就只对最低有效的 32 位进行运算,然后将它与 0 进行或运算(这什么都不做,但会给你相同的结果)。
关于javascript - ruby 与 javascript 中的按位或,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14898998/