作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我发现当二进制表示大于 32 位时,在 Ruby 中使用整数会导致它们的行为不同于 JS。
a = 144419633058839139324
b = 3903086624
JS:
a >> 0; => 1482555392
b >> 0; => -391880672
ruby :
a >> 0 => 144419633058839139324
[a].pack('V').unpack('V').first => 1482560508
[b].pack('V').unpack('V').first => 3903086624
我的问题是如何转换我的 Ruby 代码以提供相同的返回值 JS?
最佳答案
这是一个很好的问题。我做了一些实验,试图弄清楚 JavaScript 到底在做什么操作,但后来我想,“我敢打赌规范是这么说的。”果然如此!
首先我查看了 Bitwise Shift Operators部分,我从中学到的是你已经知道的:在进行按位运算之前,JavaScript 将其操作数转换为 32 位整数。为此,它链接到名为 ToInt32 的“抽象操作”(即由 JavaScript 引擎实现的算法)的定义。 .令人高兴的是,它真的很容易理解:
ToInt32: (Signed 32 Bit Integer)
The abstract operation ToInt32 converts its argument to one of 232 integer values in the range -231 through 231−1, inclusive. This abstract operation functions as follows:
- Let number be the result of calling ToNumber on the input argument. [This just converts non-numeric values like booleans and strings into numbers.]
- If number is NaN, +0, −0, +∞, or −∞, return +0.
- Let posInt be
sign(
number) * floor(abs(
number))
. [sign
returns -1 if number is negative or 1 if it's positive.]- Let int32bit be posInt modulo 232; that is, a finite integer value k of Number type with positive sign and less than 232 in magnitude such that the mathematical difference of posInt and k is mathematically an integer multiple of 232.
- If int32bit is greater than or equal to 231, return int32bit − 232, otherwise return int32bit.
我们可以将其直接转换为 Ruby(我将步骤 1-5 编号为注释):
def to_int32(number)
# (1)(2)
begin
sign = number < 0 ? -1 : 1
abs = number.abs
return 0 if abs == 0 || abs == Float::INFINITY
rescue
return 0
end
pos_int = sign * abs.floor # (3)
int_32bit = pos_int % 2**32 # (4)
# (5)
return int_32bit - 2**32 if int_32bit >= 2**31
int_32bit
end
那么,它有效吗?
a = 144419633058839130000
puts to_int32(a)
# => 1482551184
b = 3903086624
puts to_int32(b)
# => -391880672
似乎是合法的!
现在,我确信有更简洁且可能更快的方法来执行此操作,但这应该可以帮助您入门。
关于javascript - 如何在按位运算期间 chop 大整数以模仿 Ruby 中的 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26209228/
我是一名优秀的程序员,十分优秀!