Xor如何交换价值?

Sci*_*n11 8 java algorithm bitwise-xor

这是原始代码:

public static String reverseString(String s){       
    if(s == null) return "";        
    char[] rev = s.toCharArray();
    int i = 0, j = s.length() - 1;
    while(i < j) {
        rev[i] ^= rev[j];
        rev[j] ^= rev[i];
        rev[i++] ^= rev[j--];           
    }       
    return String.valueOf(rev); 
}
Run Code Online (Sandbox Code Playgroud)

我的问题是Xor如何在这里交换字符值,为什么需要rev [i ++] ^ = rev [j--]?

ajb*_*ajb 14

代码相当于

    rev[i] ^= rev[j];
    rev[j] ^= rev[i];
    rev[i] ^= rev[j];           
    i++;  j--;
Run Code Online (Sandbox Code Playgroud)

最后一部分只需要递增i和递减j下一个循环迭代.

至于为什么x ^= y; y ^= x; x ^= y要交换值,我不知道为什么,但你可以通过查看所有四种可能性看到它适用于1位值:

 start   after x^=y  after y^=x   after x^=y
x    y     x   y       x   y        x   y
0    0     0   0       0   0        0   0
0    1     1   1       1   0        1   0
1    0     1   0       1   1        0   1
1    1     0   1       0   1        1   1
Run Code Online (Sandbox Code Playgroud)

所以你可以看到,在所有情况下,xy位都是交换的.当语句应用于更大的整数时,^运算符并行处理所有位,因此最终结果是交换每对位,即交换整个值.