尝试将UID生成器从Javascript转换为Ruby,我想了解以下行为。
这行代码
89190868196442450 | 0
会在javascript中给出
1074708816
和红宝石
89190868196442450
我完全理解ruby行为,因为如果它存在于eather操作数中,Bitwise OR运算符会复制一点,但我仍然对javascript行为感到困惑。 我在javascript整数表示中看得更深,无法找到明确的解释。我found this,但没有完全明白。
二进制文件中的89190868196442450为100111100110111101001111101000000000011101100000101010010,使其长度为57位。
任何人都可以给我一个明确的解释或上面的结果。我应该对ruby代码执行哪些操作以确保类似的行为?
答案 0 :(得分:3)
如果您想用>表示数字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取最低有效 32位并将它们与0进行或运算,产生1074708816,而在Ruby中,它与所有位进行或运算。如果由于某种原因你想在Ruby中重现它,你会用1FFFFFFFF和你的数字进行比较,这样你只能在最低有效32位上运行,然后用0运算它(它什么都不做,但会给你相同的结果)。