Java 异或交换在所有情况下都等同于传统交换吗?

Java 异或交换在所有情况下都等同于传统交换吗?,java,string,bit-manipulation,swap,bitwise-xor,Java,String,Bit Manipulation,Swap,Bitwise Xor,下面是执行“就地”字符串反转的方法,即黑猫变为黑猫。 在第二个交换部分中,如果使用传统交换(注释掉),则所有测试都通过,但是如果使用异或交换,则只有一个测试通过 难道不能简单地“交换”吗 for (int i = count; i <= (end + count) / 2; i++) { char temp = arr[i]; arr[i] = arr[end - (i - count)]; arr[e

下面是执行“就地”字符串反转的方法,即黑猫变为黑猫。 在第二个交换部分中,如果使用传统交换(注释掉),则所有测试都通过,但是如果使用异或交换,则只有一个测试通过

难道不能简单地“交换”吗

        for (int i = count; i <= (end + count) / 2; i++) {
            char temp = arr[i];
            arr[i] = arr[end - (i - count)];
            arr[end - (i - count)] = temp;
        }
失败输出

java.lang.AssertionError: 
Expected: ["C", "a", "t", " ", "B", "l", "a", "c", "k"]
but: was ["C", "

与自身交换值时,异或交换失败。这是您的代码:

arr[i] ^= arr[end - (i - count)];
arr[end - (i - count)] ^= arr[i];
arr[i] ^= arr[end - (i - count)];
让我们假设
i==end-(i-count)
。然后:

arr[i] ^= arr[end - (i - count)];
arr[i]
设置为零(因为任何与自身异或的值都是零)

接下来的两行什么也不做,因为用零进行异或没有效果,将
arr[i]
保留为零,从而破坏您的输入

如上所述,上述假设是否成立取决于输入的长度


由于这个原因,异或交换是危险的。因为它也很难阅读,而且在任何现代平台上都不是一个性能胜利,所以这种微优化技巧已经过时,应该避免。

实际上编写一个交换方法(
静态无效交换(char[]arr,int i,int j)
)并自行测试。输出似乎是一个字符串数组,不是一个
字符数组
@code学徒一个测试通过了使用异或交换和使用传统交换。字符串的总长度似乎是决定因素。
java.lang.AssertionError: 
Expected: ["C", "a", "t", " ", "B", "l", "a", "c", "k"]
but: was ["C", "
arr[i] ^= arr[end - (i - count)];
arr[end - (i - count)] ^= arr[i];
arr[i] ^= arr[end - (i - count)];
arr[i] ^= arr[end - (i - count)];