为什么reverse()/StringBuffer类中的StringBuilder方法使用按位运算符?

我想知道它的优点。

public AbstractStringBuilder reverse() {
    boolean hasSurrogate = false;
    int n = count - 1;
    for (int j = (n-1) >> 1; j >= 0; --j) {
        char temp = value[j];
        char temp2 = value[n - j];
        if (!hasSurrogate) {
            hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE)
                || (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE);
        }
        value[j] = temp2;
        value[n - j] = temp;
    }
    if (hasSurrogate) {
        // Reverse back all valid surrogate pairs
        for (int i = 0; i < count - 1; i++) {
            char c2 = value[i];
            if (Character.isLowSurrogate(c2)) {
                char c1 = value[i + 1];
                if (Character.isHighSurrogate(c1)) {
                    value[i++] = c1;
                    value[i] = c2;
                }
            }
        }
    }
    return this;
}

最佳答案

右移一意味着除以二,我认为您不会注意到任何性能差异,编译器将在编译时执行这些优化。

许多程序员习惯于除法而不是编写/ 2时将其右移二位,这是一种风格问题,或者也许有一天,右移实际上比通过编写/ 2进行除法更有效(在优化之前)。编译器知道如何优化这样的事情,我不会浪费时间去尝试编写其他程序员可能不清楚的东西(除非它们确实有所作为)。无论如何,循环等效于:

int n = count - 1;
for (int j = (n-1) / 2; j >= 0; --j)

正如@MarkoTopolnik在他的评论中提到的那样,JDK编写时根本没有考虑任何优化,这也许可以解释为什么他们明确地将数字右移一位而不是明确地除以数字,如果他们考虑优化的最大力量,他们可能会写了/ 2

万一您想知道为什么它们相等,最好的解释是举例,考虑数字32。假设为8位,其二进制表示为:
00100000

右移一个:
00010000

其值为16(1 * 24)

07-26 03:49