【发布时间】:2012-09-13 13:24:33
【问题描述】:
我找到了切换两个变量值的解决方案,不创建第三个变量,如下:
x ^= y;
y ^= x;
x ^= y;
这是使用 exclusive-or 运算符(“XOR”),而不是布尔值(我假设它是 bitwise?)。最近学习了一些离散数学,我可以理解XOR运算符与真值表的用法:
.......................
x y (x XOR y)
.......................
T T F
T F T
F T T
F F F
表达式(x XOR y) 当两个变量相等时计算为false,否则计算为true。但是当值不是布尔值时WTF?
无论如何,如果我将 x 和 y 设置为 int 值而不是布尔值,则操作不是很简单。因此,例如让
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.
【问题讨论】:
-
欢迎回到汇编编程的旧时代(我认为这个技巧实际上是用来减少寄存器使用的)...出于好奇:您不打算在实际代码中的任何地方使用它吗? PS:恕我直言,这与 XORed 双向链表有些相关,也许你会觉得这很有趣:en.wikipedia.org/wiki/XOR_linked_list。
-
对汇编编程很感兴趣@Axel。这个 XOR 变量交换问题在许多博客中被提到是一个相关的面试问题,但在研究这个问题后,我发现它有点晦涩难懂而且不是很直观。我想我宁愿只使用第三个变量来做 2 个变量交换的事情,因为这更容易阅读。因此,尽管进一步深入兔子洞,我现在有兴趣学习如何将整数转换为位,以及可能有什么用途。这种二进制转换的相关性有多大?