2012-06-07 44 views
2

在回顾“Crossfilter”源时,我遇到了一个使用>>的函数。以下是功能:>>在javascript中做什么?

// Similar to bisectLeft, but returns an insertion point which comes after (to 
    // the right of) any existing entries of x in a. 
    // 
    // The returned insertion point i partitions the array into two halves so that 
    // all v <= x for v in a[lo:i] for the left side and all v > x for v in 
    // a[i:hi] for the right side. 

    function bisectRight(a, x, lo, hi) { 
    while (lo < hi) { 
     var mid = lo + hi >> 1; 
     if (x < f(a[mid])) hi = mid; 
     else lo = mid + 1; 
    } 
    return lo; 
    } 

谷歌没有返回任何结果,我从来没有见过这种情况。先谢谢您的帮助。

+1

这就像Math.floor(n/2)。在上面的例子中,注意'+'比位移有更高的优先级,所以'mid'将是'(lo + hi)>> 1'。 – Steve

+0

如果你有将来的疑虑,你可以试着找出运行非常简单的代码(比如'a = 10; alert(a >> 1);')。 –

回答

6

这是sign-propagating right shift operator

该运算符将第一个操作数位的指定数量 的权利。向右移位的过多位被丢弃。最左边的位的副本 从左侧移入。由于最新的 与前一个最左边的位具有相同的值,因此 位(最左边的位)不会改变。因此名称 “sign-propagating”。

1

它做正确的按位的转变,这是大致类似于通过向整除2^X(在你的例子 - 只要除以2找到平均值)。它是碰巧存在于多种语言中的一个bitwise operators,它使用数字的二进制表示法。它通常用于性能方面,因为它几乎总是比分割更快。