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

特拉维斯

我发现在Ruby中使用整数会导致它们的二进制表示形式大于32位时,它们的行为不同于JS。

a = 144419633058839139324
b = 3903086624

JS:

a >> 0; => 1482555392
b >> 0; => -391880672

红宝石:

a >> 0 => 144419633058839139324
[a].pack('V').unpack('V').first => 1482560508
[b].pack('V').unpack('V').first => 3903086624

我的问题是如何转换我的Ruby代码以提供相同的返回值JS?

乔丹跑步

这是一个很好的问题。我做了一些实验,试图弄清楚JavaScript到底在做什么,但后来我想:“我敢打赌,规范说。” 果然做到了!

首先,我检查了“按位移位运算符”部分,然后从中学到的知识是您已经知道的:在进行按位运算之前,JavaScript将其操作数转换为32位整数。为此,它链接到名为ToInt32的“抽象操作”(即由JavaScript引擎实现的算法)的定义令人高兴的是,这很容易理解:

ToInt32 :(带符号的32位整数)

抽象操作ToInt32将其自变量转换为-2 31到2 31 -1(含)范围内的2 32个整数值之一此抽象操作的功能如下:

  1. number在输入参数上调用ToNumber的结果[这只是将非数字值(如布尔值和字符串)转换为数字。]
  2. 如果numberNaN+0-0+∞-∞,则返回+0
  3. posIntsign(数字) * floor(abs(number))[sign如果number为负,则返回-1;如果为负,则返回1。]
  4. int32bitposInt模2 32 ; 也就是说,Number类型的有限整数值k具有正号并且大小小于2 32,因此posInt和k的数学差为2 32的整数倍
  5. 如果int32bit大于或等于2 31,则返回int32bit -2 32,否则返回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

似乎是合法的!

现在,我敢肯定有更简洁,可能更快的方法来执行此操作,但这应该可以帮助您入门。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在按位运算中选择正确的左移?

来自分类Dev

Busybox awk:如何将String中的每个字符视为整数以执行按位运算?

来自分类Dev

如何在 JavaScript 中计算整数中的 1 位

来自分类Dev

如何在Ruby中模仿Finder / Mac OS复制?

来自分类Dev

如何在javascript中以2位小数以指数格式显示变量?

来自分类Dev

如何在Node.js中执行64位整数运算?

来自分类Dev

如何在JavaScript中模仿Python的step参数?

来自分类Dev

如何在C中按位运算存储移位的位?

来自分类Dev

如何在 C# 中截断为整数除法?

来自分类Dev

如何在活动中存储整数以进行计算

来自分类Dev

javascript如何处理大整数(大于52位)?

来自分类Dev

如何编写模仿Ruby的%w运算符的Clojure宏

来自分类Dev

如何编写模仿Ruby的%w运算符的Clojure宏

来自分类Dev

如何在Fortran中处理大整数?

来自分类Dev

按位和运算符如何在javascript中的对象上工作?

来自分类Dev

SQL查询中的大无符号整数(> 1024bit)的按位运算符

来自分类Dev

PHP中对大整数进行按位运算的最大限制是多少?

来自分类Dev

如何在C ++中处理大于8字节或大于20位的大整数数据

来自分类常见问题

如何在Javascript中获得大浮点数的前两位

来自分类Dev

如何在Javascript中获得大浮点数的前两位

来自分类Dev

如何在 JavaScript 中创建大小为 128 位的无符号整数数组?

来自分类Dev

在按钮操作期间如何在 Textview 中添加新行?

来自分类Dev

如何使用按位运算符和位操作在C中交换2个整数?

来自分类Dev

如何在Cassandra中模仿GROUP BY

来自分类Dev

如何在属性中模仿Sass for循环?

来自分类Dev

如何检查除数是否为整数以及如何在Delphi中从符号行中取出?

来自分类Dev

大整数算法-如何实现模运算?

来自分类Dev

大整数算法-如何实现模运算?

来自分类Dev

如何在C ++按位运算中计算最接近的8整数?

Related 相关文章

  1. 1

    如何在按位运算中选择正确的左移?

  2. 2

    Busybox awk:如何将String中的每个字符视为整数以执行按位运算?

  3. 3

    如何在 JavaScript 中计算整数中的 1 位

  4. 4

    如何在Ruby中模仿Finder / Mac OS复制?

  5. 5

    如何在javascript中以2位小数以指数格式显示变量?

  6. 6

    如何在Node.js中执行64位整数运算?

  7. 7

    如何在JavaScript中模仿Python的step参数?

  8. 8

    如何在C中按位运算存储移位的位?

  9. 9

    如何在 C# 中截断为整数除法?

  10. 10

    如何在活动中存储整数以进行计算

  11. 11

    javascript如何处理大整数(大于52位)?

  12. 12

    如何编写模仿Ruby的%w运算符的Clojure宏

  13. 13

    如何编写模仿Ruby的%w运算符的Clojure宏

  14. 14

    如何在Fortran中处理大整数?

  15. 15

    按位和运算符如何在javascript中的对象上工作?

  16. 16

    SQL查询中的大无符号整数(> 1024bit)的按位运算符

  17. 17

    PHP中对大整数进行按位运算的最大限制是多少?

  18. 18

    如何在C ++中处理大于8字节或大于20位的大整数数据

  19. 19

    如何在Javascript中获得大浮点数的前两位

  20. 20

    如何在Javascript中获得大浮点数的前两位

  21. 21

    如何在 JavaScript 中创建大小为 128 位的无符号整数数组?

  22. 22

    在按钮操作期间如何在 Textview 中添加新行?

  23. 23

    如何使用按位运算符和位操作在C中交换2个整数?

  24. 24

    如何在Cassandra中模仿GROUP BY

  25. 25

    如何在属性中模仿Sass for循环?

  26. 26

    如何检查除数是否为整数以及如何在Delphi中从符号行中取出?

  27. 27

    大整数算法-如何实现模运算?

  28. 28

    大整数算法-如何实现模运算?

  29. 29

    如何在C ++按位运算中计算最接近的8整数?

热门标签

归档