C语言中不借用中间值交换数据的方法


c语言中要实现两个变量的交换一般需要一个额外的变量,但借用位运算可以实现无需中间值的值交换,代码如下:

void swap(int *a, int *b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; }

以上代码使用了位运算中的‘异或’,即 ' ^ ' 对于异或,有如下法则:

1 ^ 1 = 0; 1 ^ 0 = 1; 0 ^ 0 = 0;

因此对数x,有

x ^ x = 0 且 x ^ 0 = x

将上述代码自下而上“展开”,可以得到对a来说,有:

*a = (*a ^ *b) ^ (*b ^ (*a ^ *b)) = (*a ^ *b) ^ *a = *b

对b来说同理,所以最终两指针指向位置的值交换。

然而这种方法会在a和b指向同一位置时出现错误,语句*a = *a ^ *b;会将指针指向位置的值意外地置为0,因此后续的操作失去意义。因此使用该函数前最好进行判断。


← Prev C语言编程Tips