【问题标题】:Why does OR 0 round numbers in Javascript?为什么在 Javascript 中 OR 0 舍入数字?
【发布时间】:2013-08-13 21:21:29
【问题描述】:

我的印象是,Javascript 中的 Number 类型根据 IEEE 浮点标准存储任何数字、整数或浮点数。如果是这样,那么为什么要对一个数字与 0 进行按位或运算呢?

玩弄其他一些位操作,似乎在对浮点数应用位操作时,数字首先向 0 舍入,然后再应用位操作(数字采用二进制补码表示,而不是 IEEE)。这是正确的吗?

【问题讨论】:

  • 如果我没记错的话,所有按位运算都会将输入转换为 32 位 整数
  • @bfavaretto 这实际上是 mdn 上用于按位运算的第一句话
  • @aaronman 我刚刚看到了。但是 MDN 并没有明确说它们会变成整数。规范对此很清楚,它总是在输入上使用ToInt32
  • 你可以在网上找到完整的语言规范,@hchau。
  • @bfavaretto 有趣我从未真正阅读过规范或任何内容

标签: javascript bit-manipulation


【解决方案1】:

在 ECMAScript 5.1 中,所有按位运算都会将输入转换为 32 位整数,并返回一个 32 位整数。关于运营商^&|section 11.10 表示:

产生式A : A @ B,其中@ 是 上面的产品,评估如下:

1) 令 lref 为评估 A 的结果。
2) 令 lval 为 GetValue(lref)。
3) 令 rref 为评估 B 的结果。
4) 设 rval 为 GetValue(rref)。
5) 令 lnum 为 ToInt32(lval)。
6) 设 rnum 为 ToInt32(rval)。
7) 返回 将按位运算符 @ 应用于 lnum 和 rnum 的结果。结果 是一个有符号的 32 位整数。

注意ToInt32在应用运算符之前两边都应用了。

【讨论】:

    【解决方案2】:

    引用MDN

    按位运算符将其操作数视为 32 位(零和一)的序列,而不是十进制、十六进制或八进制数。

    如果你不这样对待数字,那么按位运算就没有多大意义,这就是它完成的原因

    【讨论】:

    • 不仅如此,操作数在应用 OR 操作之前被转换为整数。
    【解决方案3】:

    在语言级别,只有浮点数和用于位运算符的临时整数。

    Per spec,浮点数通过abstract操作变成32位整数:

    var n = (sign(number) * floor(abs(number))) % pow(2, 32);
    if( n >= pow( 2, 31 ) ) {
         return n - pow( 2, 32 );
    }
    else {
         return n;
    }
    

    我必须强调,这个操作是抽象的,当然不是任何引擎以上述方式完成的,所以不要从中得出任何性能考虑。 (这也适用于任何其他规范操作)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-07
      • 2019-01-26
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2022-07-27
      • 2019-07-06
      • 2014-05-25
      相关资源
      最近更新 更多