我找到了一个解决方案来切换两个变量的值,没有创建第三个变量,如下所示:
x ^= y;
y ^= x;
x ^= y;
这是使用 exculsive-or 运算符(“XOR”),而不是布尔值(我假设它是按位?)。最近学了一些离散数学,我可以用真值表来理解XOR运算符的用法:
.......................
x y (x XOR y)
.......................
T T F
T F T
F T T
F F F
当两个变量相等时,表达式(x XOR y)
的计算结果为 false ,否则计算结果为 true 。但是当WTF不是布尔值时WTF?
x = 3
和y = 5
:
public class SwitchValues
{
// instance methods
public void SwitchBoolean(boolean x, boolean y)
{
System.out.println("The variable \"x\" is initially: " + x + ".\n" +
"The variable \"y\" is initially: " + y + ".");
x ^= y;
System.out.println("x ^= y is equal to: " + x + ".");
y ^= x;
System.out.println("y ^= x is equal to: " + y + ".");
x ^= y;
System.out.println("x ^= y is now equal to: " + x + ".");
System.out.println("The variable \"x\" is now: " + x + ".\n" +
"The variable \"y\" is now: " + y + ".\n");
} // end of SwitchBoolean
public void SwitchInts(int x, int y)
{
System.out.println("The variable \"x\" is initially: " + x + ".\n" +
"The variable \"y\" is initially: " + y + ".");
x ^= y;
System.out.println("x ^= y is equal to: " + x + ".");
y ^= x;
System.out.println("y ^= x is equal to: " + y + ".");
x ^= y;
System.out.println("x ^= y is now equal to: " + x + ".");
System.out.println("The variable \"x\" is now: " + x + ".\n" +
"The variable \"y\" is now: " + y + ".\n");
} // end of SwitchInts
// main method
public static void main(String[] args)
{
SwitchValues obj = new SwitchValues();
obj.SwitchBoolean(true, false);
obj.SwitchInts(3, 5);
} // end of main method
} // end of class SwitchValues
...并且为int值打印的结果如下:
The variable "x" is initially: 3.
The variable "y" is initially: 5.
x ^= y is equal to: 6.
y ^= x is equal to: 3.
x ^= y is now equal to: 5.
The variable "x" is now: 5.
The variable "y" is now: 3.
答案 0 :(得分:4)
这是操作的方式。首先,我们将以二进制编写您的数字:
3 = 011,5 = 101
现在,当我们对它们进行xor时,我们得到一个数字,表示两个原始数字之间的哪些位不同。
011 xor 101 => 110这是十进制的6。
现在我们拿第二个数字和xor与我们刚刚得到的差异
101 xor 110 => 011(十进制3)我们得到这些数字之间的差异,我们回到原来的第一个数字。现在我们再次使用这个新数字并将其与我们最初获得的差异进行比较
011 xor 110 => 101(小数点后5位)我们已经找回原来的第二个数字。
在XOR Swap wiki上,您可以看到更清晰的描述,并且还可以推断为什么这比在大多数现代架构和编译器上使用临时变量要慢。
答案 1 :(得分:3)
当应用于数字类型时,XOR是逐位异或。因此,您可以将原始真值表并行应用于每个位。这应该有助于了解正在发生的事情。
答案 2 :(得分:3)
其实你自己给了答案。你假设int上的xor是按位的,那是正确的。将数字转换为位表示,然后逐位应用xor。
3是二进制的11。 5是二进制101
011
101
--- xor
110
110是十进制的6。
如果您想知道如何计算数字的二进制重新定位,您应该查找 Horner的方法。它很容易做到。