使用位运算交换两个数的值
void swap(int *x, int *y){
//假设原始数据x=a,y=b
*y = *x ^ *y;//此时x=a不变, y=a^b
*x = *x ^ *y;//此时x=a^a^b=b, y=a^b不变
*y = *x ^ *y;//此时x=b不变, y=b^a^b=a
}
其中^表示按位bool运算: “EXCLUSIVE-OR异或”,具有性质:
- a^a=0
- 0^a=a
- (a^b)^c=a^(b^c)
思考:
1.如果输入是两个同样的数,可以正常交换吗?
答:可以,没有问题
2.如果输入的是两个同样的地址呢?
答:不可以,这样会被置0,因为a^a=0,而且x与y始终同值
其他应用:
比如一道算法题:找出唯一 一个 只出现奇数次的数。可以用异或的位运算解决
参考资料:深入理解计算机系统 第3版