gpt4 book ai didi

javascript - 如何在按位运算期间 chop 大整数以模仿 Ruby 中的 JavaScript?

转载 作者:数据小太阳 更新时间:2023-10-29 07:15:58 32 4
gpt4 key购买 nike

我发现当二进制表示大于 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:

  1. Let number be the result of calling ToNumber on the input argument. [This just converts non-numeric values like booleans and strings into numbers.]
  2. If number is NaN, +0, −0, +∞, or −∞, return +0.
  3. Let posInt be sign(number) * floor(abs(number)). [sign returns -1 if number is negative or 1 if it's positive.]
  4. 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.
  5. 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com