众所周知,在进行排序操作的时候,交换数组中对应索引的值是排序的元操作,但是见过很多的swap函数都是引入第三个临时变量来完成交换操作(如下面这一小段例程所示):
swap_int (v 1.0)
void swap_int(int &a, int &b)
{
int tmp;
tmp = -1;
tmp = *a;
*a = *b;
*b = tmp;
}
{
int tmp;
tmp = -1;
tmp = *a;
*a = *b;
*b = tmp;
}
但是能不能不引进临时变量实现交换呢?感谢Boolean Algebra,注意到异或 ^ 运算的两条性质:
1. a ^ a = 0;
2. a ^ 0 = a;
2. a ^ 0 = a;
受到这个性质的启发就可以尝试重构我们的swap_int算法(v 2.0)实现:
swap_int (v 2.0)
void swap_int(int &a, int &b)
{
*b = *a ^ *b;
*a = *a ^ *b;
*b = *a ^ *b;
}
{
*b = *a ^ *b;
*a = *a ^ *b;
*b = *a ^ *b;
}
Ok,是不是可以了呢?但是不要认为减少了一个临时变量的算法性能会提高,事实上上面的v 2.0 实现性能并没有提高,这段小程序的实现的价值只是提供另外一种用Boolean Algebra进行运算思考的方式。
转载于:https://blog.51cto.com/lirui/797986