1. 核心思路
位运算是一个很奇妙的工具. 而最容易被人所忽略的就是异或 ^ 运算符. 对于任何的异或运算都有:
a^0 = a
a^a = 0
异或运算满足交换律和结合律, 因此
a^b = b^a
a^b^c = a^c^b = b^c^a = ...
由于有上述这些特性, 如果做这样的运算, 假设有两个变量 a 与 b
a = a^b
b = a^b
a = a^b
最终 总为a与b的值互为调换. 证明省略(可根据上述特性得出).
因此, 可创建如下宏, 作为工具.
#define __swap(a,b) do{a=a^b;b=a^b;a=a^b;}while(0)
do + while(0) 以确保内容处于相同的作用域中.
2. memswap函数
1) 接口设计
编写函数, 尤其是用于封装成库的函数, 要考虑接口的通用性, 广泛性及可靠性. 最简单的就是参照C标准库,仿写接口.
查看标准库函数参考可使用以下命令行( 仅适用于Linux 及 macOS ).