【问题标题】:What is ">>>" operator in JS? [duplicate]什么是 JS 中的“>>>”运算符? [复制]
【发布时间】:2012-05-10 01:27:10
【问题描述】:

可能重复:
javascript >>> operator?
JavaScript triple greater than

在这样的代码行中找到了这个运算符:

var t = Object(this),
        len = t.length >>> 0;

这个运算符是什么意思?

完整代码如下。是JSsome方法的代码:

if (!Array.prototype.some) {
  Array.prototype.some = function(fun /*, thisp */) {
    "use strict";

    if (this == null) throw new TypeError();

    var t = Object(this),
        len = t.length >>> 0;

    if (typeof fun != "function") throw new TypeError();

    var thisp = arguments[1];

    for (var i = 0; i < len; i++) {
      if (i in t && fun.call(thisp, t[i], i, t))
        return true;
    }

    return false;
  };
}

【问题讨论】:

标签: javascript arrays iterator operators


【解决方案1】:

&gt;&gt;&gt; 是右移没有符号扩展

如果您对负数使用&gt;&gt; 运算符,结果也将为负数,因为原始符号位被复制到所有新位中。使用 &gt;&gt;&gt; 时,将复制一个零。

在这种特殊情况下,它只是被用作将 length 字段限制为无符号 31 位整数的一种方式,或者换句话说,将 Javascript 的本机 IEEE754 “双”数“转换”为整数。

【讨论】:

  • 是的,很遗憾这个问题已经结束了 - why 在这里使用这个特定运算符的上下文比其一般用法的细节更重要。
  • 值得一提的是,这里的 signed right shift 运算符并没有什么特别之处。每当在 ecmascript 中应用 按位运算符 时,值都会转换为它们的 32 位版本。所以在这里使用~~t.length也会有同样的结果。
  • @jAndy 实际上不会 - ~~n 仍然会为负输入产生负结果。
  • @Alnitak:你是对的。哦,无论如何,如果由于某种原因一个负数被转换为&gt;&gt;&gt; 0,结果将是一个相当巨大的数字。那是想要的吗?但是,我上面的陈述对于 32 位转换 仍然适用。
  • -1 &gt;&gt;&gt; 0 给出4294967295,对于以后的迭代来说不是那么糟糕吗? (在 OP 的脚本中,; i &lt; len; i++
【解决方案2】:

这是一个零填充右移。当您对数字进行位移时,您可以决定用零或符号位填充最左边的位。

在二进制补码表示中,负数以 1 作为前导位,而正数以 0结果是一个正数。

【讨论】:

  • 在阅读了解释之后 - 仍然有点困惑,因为我没有太多接触按位场景 - 在代码示例中简单来说 - 这样做是为了 防止 负面数字?我在你的最后一句话中迷失了。谢谢
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 2021-11-26
  • 2016-08-28
  • 2012-12-29
  • 2019-07-01
  • 2011-05-30
  • 2014-03-24
  • 2012-06-15
相关资源
最近更新 更多