您的位置:首页 > 编程语言 > Java开发

Java中异或运算实现两个整数的交换以及其功能函数实现

2015-12-08 19:39 981 查看
今天学习到一种超酷炫的交换两个整数的方法,给各位分享一下。异或运算属于位运算的一种,首先简单介绍一下异或预算的语法规则。

假设a与b为不相等的两个整数。

(1)a^a=0;

(2)a^b=1;

(3)a^0=a;

(4)a^b=b^a,即异或满足交换律。

(5)(a^b)^c=a^(b^c),即异或满足结合律。

接下来介绍一下异或运算实现两个整数交换的原理,同样假设a与b为两个不相等的整数。

第一步:a=a^b。此时a=a^b;

第二步:b=a^b。因为上步a=a^b,所以此时b=a^b=(a^b)^b=a^(b^b)=a^0=a;

第三步:a=a^b。因为上步a=a^b,b=a,所以此时a=a^b=(a^b)^a=(b^a)^a=b^(a^a)=b^0=b。

<span style="font-size:18px;">public class Test1 {
public static void main(String[] args) {
int a=5;
int b=2;
System.out.println("交换后:a="+a+", b="+b);
a=a^b;
b=a^b;
a=a^b;
System.out.println("交换后:a="+a+", b="+b);
}
}</span>

异或运算操作简单,运算速度快,且不需要开辟额外的内存空间。是不是很酷炫呢?有时候为了编码需要,我们要将这样的功能封装在一个函数体中,但如下所示的方法是不能实现两个整数的交换的,只是交换了a和b的地址而已。

<span style="font-size:18px;">private void swap(int a,int b) {
int t=a;
a=b;
b=t;
}</span>


java中没有指针和引用的概念,我们没有办法像C那样在函数体中通过传递引用来实现两个整数的交换,那么要怎么做呢?我们可以借助数组来完成,数组的索引相当于C中的指针。我们通过异或运算和建立临时变量两种方法来分别说明使用如何使用数组来实现交换的功能函数。

<span style="font-size:18px;">public class Test2 {
public static void main(String[] args) {
int a=5;
int b=2;
int []f=new int[2];
f[0]=a;
f[1]=b;
System.out.println("交换后:a="+a+", b="+b);
swapByBit(f);
System.out.println("通过异或交换:a="+f[0]+", b="+f[1]);
swapByTemp(f);
System.out.println("通过临时变量交换:a="+f[0]+", b="+f[1]);
}
private static void swapByBit(int []f) {
f[0]=f[0]^f[1];
f[1]=f[0]^f[1];
f[0]=f[0]^f[1];
}
private static void swapByTemp(int []f) {
int t=f[0];
f[0]=f[1];
f[1]=t;
}
}
</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: