【发布时间】:2010-10-13 19:58:53
【问题描述】:
void swap(ref int x, ref int y)
{ x = x ^ y; y = y ^ x; x = x ^ y; }
我正在学习按位异或。这种交换是如何发生的?这让我大吃一惊。这种方法应该交换X和Y的内容,但我完全不明白发生了什么?
【问题讨论】:
-
用二进制的 x 和 y 值示例在纸上写下操作。
-
保持这种状态,不要使用它。总有一天谁会维护你的代码也不会。你会在 C++ 标签下找到几个关于它的线程,寻找被否决的线程。否则用 0 和 1 写出来以查看它的工作原理。两个比特就足够了。
-
这是我在第一年的 compsci 课上学到的交换技巧之一。在没有任何理由的情况下执行这种最微小的微优化时,我不禁感到愚蠢,而明显的替代方案 (temp = x; x = y; y = temp;) 清晰一百万倍。并且对于编译器来说,优化也可能容易上百万倍。
-
尝试交换(参考 x,参考 x)。惊喜! :-)
-
这是在 60 年代末和 70 年代初编写的 HLASM 应用程序中的常见做法,即使是大型机也几乎没有内存来托管应用程序。 XOR 技术的好处是它使用更少的指令来交换寄存器或变量,因此需要更少的空间。不幸的是,我一直在维护这样一个程序,直到它被 COBOL 重写为 Y2K。我认为该技术在现代系统中没有任何用处。