为什么PriorityQueue会做(k-1)>>> 1?

时间:2016-01-07 01:05:28

标签: java bit-manipulation priority-queue

我正在学习Java中的PriorityQueue 当我查看offer方法时,无法找出在(k - 1) >>> 1方法中使用siftUpComparable的原因。
这是源代码:

public boolean offer(E e) {
    if (e == null)
        throw new NullPointerException();
    modCount++;
    int i = size;
    if (i >= queue.length)
        grow(i + 1);
    size = i + 1;
    if (i == 0)
        queue[0] = e;
    else
        siftUp(i, e);
    return true;
}

private void siftUp(int k, E x) {
    if (comparator != null)
        siftUpUsingComparator(k, x);
    else
        siftUpComparable(k, x);
}

private void siftUpComparable(int k, E x) {
    Comparable<? super E> key = (Comparable<? super E>) x;
    while (k > 0) {
        int parent = (k - 1) >>> 1; // what's the purpose of this line?
        Object e = queue[parent];
        if (key.compareTo((E) e) >= 0)
            break;
        queue[k] = e;
        k = parent;
    }
    queue[k] = key;
}

2 个答案:

答案 0 :(得分:2)

由于保证k > 0,该行也可以(k - 1) >> 1>>>>>运算符右移右侧操作数给出的位数。向下移动与除以2完全相同,因此这是计算parent = (k - 1) / 2(使用整数截断),但执行速度更快。

>>>>>之间的区别在于负数:>>在左侧填充符号位的当前值,而>>>总是填充零。

答案 1 :(得分:1)

它获取二进制堆中k-th元素的父元素的索引。

这是用于说话的改变方式

int parent = (k-1)/2