Java的位运算符中有一个叫异或的运算符,用符号(^)表示,其运算规则是:
两个操作数的位中,相同则结果为0,不同则结果为1。
public class TestXOR{
public static void main(String[] args){
int i = 15, j = 2;
System.out.println("i ^ j = " + (i ^ j));
}
}
运行结果是:i ^ j = 13.
分析上面程序,i=15转成二进制是1111,j=2转成二进制是0010,根据异或的运算规则得到的是1101,转成十进制就是13.
利用这个规则我们可以灵活运用到某些算法。
比如,假定有2K+1个数,其中有2k个相同,需要找出不相同的那个数,比如:2、3、4、4、3、5、6、6、5。我们利用异或运算符就可以这样写:
public class TestXOR{
public static void main(String[] args){
int[] array = {2,3,4,4,3,5,6,6,5};
int v = 0;
for (int i = 0;i < array.length;i++) {
v ^= array[i];
}
System.out.println("只出现一次的数是:" + v);
}
}
结果是:只出现一次的数是2.
我们就是巧用异或运算符的规则,得出一个数和0异或还是自己,一个数和自己异或是0的原理。也就是说在一个整形数组中,如果相同的数字是成对出现的(位置不一定相邻),遍历数组,并且两两异或,结果一定为0.
如果出现过其中一对有缺失数字,即只出现了一个,则遍历异或结果为缺失的数字。
例三:当我们完成两个变量进行交换时,我们经常创建一个临时变量来共同完成互换,但是临时变量的创建增加了系统资源的消耗,我可以使用异或运算符“^”实现两个变量的交换
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner read=new Scanner(System.in);
int a=read.nextInt();
int b=read.nextInt();
a=a^b;
b=b^a;
a=a^b;
System.out.println(a+","+b);
}
}
例四:我们可以通过位运算的异或运算符“^”把字符串与一个指定的值进行异或运算,从而改变字符串中每个字符的值,进行加密和解密;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner read=new Scanner(System.in);
String password=read.nextLine();
char[]array=password.toCharArray();
for(int i=0;i<array.length;i++) {
array[i]=(char)(array[i]^20000);
}
System.out.println(new String(array));
for(int i=0;i<array.length;i++) {
array[i]=(char)(array[i]^20000);
}
System.out.println(new String(array));
}}
代码解析:如果某个字符或数值x与一个数值m进行异或运算得到y,则再用y与m进行异或运算就可以还原为x