每日一题位运算交换两数
Posted 唐宋xy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题位运算交换两数相关的知识,希望对你有一定的参考价值。
题目
如何不使用额外变量交换两个数
解析
如果可以使用额外变量,那么交换两个数是非常简单的,但是不能使用额外变量的话,就需要通过神奇的位运算来实现了,具体的代码也非常简单
- 代码实现
a = a ^ b;
b = a ^ b;
a = a ^ b;
public static void swap (int[] arr, int i, int j)
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
特别注意:如果是对于相同位置的数进行交换,那么不能使用位运算的方式,因为会导致该位置上的数计算为0
异或运算:相同为0,不同为1
-
为什么
因为异或运算的性质是满足交换律和结合律的,所以上面的公式可以表达为:
a = a ^ b; b = a ^ b; -> b = a ^ b ^ b; // 因为上面已经将a重新赋值了,所以将a拆为上面的表达式,因为异或运算相同为0,并且0^任何数=任何数,所以这里b = a ^ (b ^ b) -> b = a; a = a ^ b; -> a = a ^ b ^ a; // 第一步中 a = a ^ b的,第二种已经将b计算了为a,那么这里拆分为 a = a ^ b ^ a; 通过交换律得到 a = (a ^ a) ^ b -> a = b;
以上是关于每日一题位运算交换两数的主要内容,如果未能解决你的问题,请参考以下文章