java - 按位运算符在 StringBuilder 中的优势

标签 java algorithm bit-manipulation

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

我想知道它的优点。

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)

关于java - 按位运算符在 StringBuilder 中的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28294794/

相关文章:

javascript - org.springframework.web.bind.MissingServletRequestParameterException : Required Long parameter 'userId' is not present"错误

java - 按位运算意外变为负数

algorithm - 蚁群算法中第K只 Ant 应该做什么?

algorithm - 你能用大 O 符号做加法/乘法吗?

algorithm - 详细的大哦问题

Python 正确使用 __str__ 和 __repr__

c - 使用按位运算符,找到一个逻辑不等价

java - 如何将 JAR 永久添加到 Eclipse?

java - 我无法在 android 5.1 上获取通知图像,始终返回 null

java - 使用 ProcessBuilder 启动 Jar