【问题标题】:How to apply bitwise operations to the actual IEEE 754 representation of JS Numbers?如何将按位运算应用于 JS 数字的实际 IEEE 754 表示?
【发布时间】:2014-07-03 22:58:07
【问题描述】:

在 JavaScript 中,每当您执行诸如 x << 2 之类的按位运算时,64 位浮点表示会在实际发生移位之前转换为 32 位无符号整数。我有兴趣将这种转变应用于实际的、未改变的 IEEE 754 位表示。

这怎么可能?

【问题讨论】:

  • 我很确定您必须编写自己的代码来获取位表示。
  • 猜猜这不是该语言的通用部分,因为 IEEE 754 数字由 64 位打包的不同字段组成。通过移位位,不清楚移位是应用于单个字段还是应用于整个“原始”64 位而不考虑尾数、符号或指数字段。在后一种情况下,它实际上是关于将 JSNumber 转换为 64 位整数以在之后移动后者。
  • 如果你能得到那个表示,
  • 以防万一:我使用 node-ffi 从 C 程序接收这些浮点数。该 C 程序使用浮点数的最低有效位用特殊标志对其进行标记。我想要一种在 JavaScript 中检查该标志的方法。

标签: javascript bit-manipulation bitwise-operators ieee-754


【解决方案1】:

您可以尝试先将 JSNumber 转换为字节/整数,然后自己移动结果。

使用主要浏览器的最新版本中可用的 TypedArray 东西:

var f = new Float64Array( 1 );    // creating typed array to contain single 64-bit IEEE754
f.set( [ 1.0 ], 0 );              // transferring JSNumber for untyped array to first element of typed one
var d = new DataView( f.buffer ); // creating raw view on content in typed array
var w1 = d.getUint32( 0 );        // accessing bytes 0 to 3 of typed array
var w2 = d.getUint32( 4 );        // accessing bytes 4 to 7 of typed array

之后,您可以将 w1w2 中的 32 位字分别转移到低位字的高 2 位到高位字的低 2 位。

可以通过使用 d.getUint32() 的第二个参数来控制 Endianess。

阅读更多:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays

只是为了确保正确识别 Bergi 的评论。我所有的代码都可能像这样简化为单行:

var d = new Uint32Array( new Float64Array( [1.0] ).buffer );

d[0]d[1] 适合访问包含的 32 位字,那么。

【讨论】:

  • 更简单:var d = new Uint32Array( new Float64Array( [1.0] ).buffer) :-)
  • 确实……我不熟悉那些“新”的东西,实际上我自己是第一次阅读 API。我的代码来自链接的文档,并且仅在控制台会话中进行了测试。虽然它的 API 很酷……
  • 嘿,谢谢。这确实回答了我的问题。不过,考虑到此处提供的信息,我已经稍微放宽了规范。现在我需要的是确定是否设置了浮点数的最低有效位。我想知道是否有任何更简单(更快)的方法可以做到这一点,或者您的解决方案是否是最佳选择。如果你知道答案,请查看我的最后一个问题!
  • 根据您测试尾数 LSB 的意图,如果不进行测试,我倾向于建议给定方法优于任何其他方法。引入类型数组以提供对数据流的低级访问,低级通常意味着更高的性能。我看到的唯一替代方法是:在清除尾数的 LSB 的情况下构建数字,但匹配所有其他符号位、指数和尾数……然后比较两者。然而,构建那个小尾数(它是 2 ^ -52)并不像上面给出的那样简单......它需要字符串处理和/或浮点运算序列。
  • 好吧,似乎该解决方案非常适合。不过,我使用的是现有的 DataView,所以我不必在每次调用时都重新创建数组(就像最后一个示例一样)!在测试中提供了更高的性能。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2019-10-23
相关资源
最近更新 更多