先来看一个交换两个bit的算法:
step1: 判断两个位是否需要交换。如果两个bit不相同(不都为0或1),转到step2,否则结束。
step2: 交换两个bit位。将两个bit位分别取反,并结束。
类似的,要交换两个变量实际上就是要交换它们的每一个bit位。《深入理解计算机系统》中有这样一个算法:
void inplace_swap(int *x, int *y)
{
*x = *x ^ *y; /* step1 */ 构造一个位模式其相应位置上的1标记出了x , y中需要交换的位
*y = *x ^ *y; /* step2 */ 交换,既对做了标记的位取反
*x = *x ^ *y; /* step3 */ 同上
}
这个算法利用了这样一个事实,(a ^ b) ^ b = a 。 这个公式为什么是正确的呢?可能有人会说了,不过是一个数学公式根本不需要怀疑,记住它就是了。但是,我们应该要试着理解它背后的数学思想,这样才能获得一种更直观、更感性的认识。
看一个具体的例子:
假设 x 和 y 的位模式分别为 x = [1100],y = [1001] 。以下的步骤展示了整个交换过程:
step1: x ^ y
1 1 0 0
^ 1 0 0 1
------------------------------------
结果: 0 1 0 1 => 这里的两个1标记出了 x ,y 相应位置上需要交换的位。
step2:
0 1 0 1
^ 1 0 0 1
------------------------------------
结果: 1 1 0 0 => 这里实际上是对 y 中做了标记的位进行取反操作,因为0、1 异或1
就相当于对0、1取反。
step3 类似第二步