交换两个数相信很多人天天写过,我也相信你每次都会使用一个额外来变量来辅助交换,例如,我们要交换 x 与 y 值,传统代码如下:
int tmp = x;
x = y;
y = tmp;
这样写有问题吗?没问题,通俗易懂,万一哪天有人要为难你,不允许你使用额外的辅助变量来完成交换呢?你还别说,有人面试确实被问过,这个时候,位运算装逼大法就来了。代码如下:
x = x ^ y // (1)
y = x ^ y // (2)
x = x ^ y // (3)
为什么会有这种骚操作,那么我就来解释一下:我们都知道在两个数异或操作时,如果两个数相同则异或结果为0;任何数与0异或都为其本身,且异或支持交换律和结合律。
所以
(1)(2)步获取y的公示 y=x^ y ^ y 等价于y=x^0
(2)(3)步获取x的公示 x=x^ x^ y 等价于x=0^y