java中 异或运算符的运用

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值