标签:
异或(exclusive OR)作为4种逻辑操作符之一,相对其他3种(OR/AND/NOT)来说,出场的次数非常少,是因为在日常开发中能用到它的场景本来就不多。对笔者来说,目前接触到场景只有交换两个数值时才会用到。
Java Code:
1 int a = 5; 2 int b = 95; 3 System.out.println(a + ", " + b); 4 5 a ^= b;//等价于 a = a ^ b; 6 b ^= a; 7 a ^= b; 8 System.out.println(a + ", " + b); 9 10 /* 11 * output: 12 * 5, 95 13 * 95, 5 14 */
具体例子:冒泡排序
1 public static int[] bubbleSort(int[] input){ 2 for(int i = input.length - 1; i > 0; i--){ 3 for(int j = 0; j < i; j++){ 4 if(input[j] > input[j + 1]){ 5 input[j] ^= input[j + 1]; 6 input[j + 1] ^= input[j]; 7 input[j] ^= input[j + 1]; 8 } 9 } 10 } 11 return input; 12 }
注意:
使用场景:
对笔者来说,使用该写法的场景只有一个:笔试时的算法题目。这是从避免潜在的不必要的沟通问题方面来考虑。
原理:
逻辑操作符的本质就是对两个二进制数,在单个位级别(bit)的操作。在Java中,由于其他3种已经用于对boolean进行运算,所以剩下异或可以用于位运算。
举最简单的例子来说明,对于两个1bit的二进制数A和B、及它们的异或运算结果C(0或1)来说,在得知任何两个数(AB/AC/BC)的情况下,最后一个数是明确的。
所以
1 a ^= b;// a=a^b 得出c,并赋值给a,即此时a=c; 2 b ^= a;// b=a^b 由于此时a=c,所以实际上是c^b得到a,并赋值给b; 3 a ^= b;// a=a^b 此时b=a,a=c 所以实际上是a^c得到b,并赋值给a,完成a与b的交换
标签:
原文地址:http://www.cnblogs.com/lawrencechen/p/4858511.html