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。
异或运算操作简单,运算速度快,且不需要开辟额外的内存空间。是不是很酷炫呢?有时候为了编码需要,我们要将这样的功能封装在一个函数体中,但如下所示的方法是不能实现两个整数的交换的,只是交换了a和b的地址而已。
java中没有指针和引用的概念,我们没有办法像C那样在函数体中通过传递引用来实现两个整数的交换,那么要怎么做呢?我们可以借助数组来完成,数组的索引相当于C中的指针。我们通过异或运算和建立临时变量两种方法来分别说明使用如何使用数组来实现交换的功能函数。
假设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>
相关文章推荐
- Java 对象特性知识点复习
- ognl.MethodFailedException异常解决方法(Struts2)
- 给Eclipse装上反编译器(eclipse反编译插件)
- java中Vector的用法是什么?
- java并发容器ConcurrentHashMap学习心得
- javaweb学习总结(九)—— 通过Servlet生成验证码图片
- [置顶] Struts2入门的入门------下载,配置,基本概念总结
- 【springmvc+mybatis项目实战】杰信商贸-17.货物修改+删除
- 【springmvc+mybatis项目实战】杰信商贸-18.附件分类基础表+数据字典
- 【springmvc+mybatis项目实战】杰信商贸-19.级联删除
- 【springmvc+mybatis项目实战】杰信商贸-20.合同货物数和附件数
- 【springmvc+mybatis项目实战】杰信商贸-21.合同总金额SQL
- 【springmvc+mybatis项目实战】杰信商贸-23.重点知识回顾
- 【springmvc+mybatis项目实战】杰信商贸-25.出货表打印
- 【springmvc+mybatis项目实战】杰信商贸-24.神奇的POI
- 【springmvc+mybatis项目实战】杰信商贸-26.出货表修饰+下载
- 【springmvc+mybatis项目实战】杰信商贸-27.POI由HSSF升级为XSSF
- 【springmvc+mybatis项目实战】杰信商贸-28.POI百万数据打印
- 【springmvc+mybatis项目实战】杰信商贸-29.购销合同技术难点分析
- 【springmvc+mybatis项目实战】杰信商贸-31.出口报运业务-购销合同查询与上报