java 使用异或运算交换

来源:互联网 发布:淘宝倒卖游戏币犯法吗 编辑:程序博客网 时间:2024/06/05 15:25

java中的数据类型分为:

图片出自:Java四类八种数据类型

对于整数类型:byte,short,int,long

(1) 可以使用异或运算,来实现两个整数变量中的值。这样的好处是,不用引入多余的空间,也不会超出改类型(例如int)的表示范围。

(2)借助缓存变量,实现交换.

对于浮点类型,不能使用异或运算来交换,可以引入一个缓存变量来实现交换

例子:

package Ctojava;public class SwapDouble{public static void main(String[] args){byte aByte=1;byte bByte=2;System.out.println("aByte="+aByte+" bByte="+bByte);aByte^=bByte;bByte^=aByte;aByte^=bByte;System.out.println("aByte="+aByte+" bByte="+bByte);System.out.println("---------------------------------");short aShort=3;short bShort=4;System.out.println("aShort="+aShort+" bShort="+bShort);aShort^=bShort;bShort^=aShort;aShort^=bShort;System.out.println("aShort="+aShort+" bShort="+bShort);System.out.println("---------------------------------");int aInt=5;int bInt=6;System.out.println("aInt="+aInt+" bInt="+bInt);aInt^=bInt;bInt^=aInt;aInt^=bInt;System.out.println("aInt="+aInt+" bInt="+bInt);System.out.println("---------------------------------");long aLong=7;long bLong=8;System.out.println("aLong="+aLong+",bLong="+bLong);aLong^=bLong;bLong^=aLong;aLong^=bLong;System.out.println("aLong="+aLong+",bLong="+bLong);float aFloat=1.23f;float bFloat=4.56f;//aFloat^=bFloat;//The operator ^= is undefined for the argument type(s) float, floatdouble aDouble=1.23;double bDouble=4.56;//aDouble^=bDouble;//The operator ^= is undefined for the argument type(s) double, double}}
结果:

aByte=1 bByte=2aByte=2 bByte=1---------------------------------aShort=3 bShort=4aShort=4 bShort=3---------------------------------aInt=5 bInt=6aInt=6 bInt=5---------------------------------aLong=7,bLong=8aLong=8,bLong=7

下面是方法中使用异或来交换两个变量的值。对应基本数据类型,及其包装类,java方法中 无法对其交换,基本数据类型实参到形参是是传值传递。对形参的操作与实际参数无关

对于引用数据类型,形参和实参都是对象的引用。对形参的操作也就是对实参的操作。

package Ctojava;class MyInt2{int myint;public MyInt2(){myint=0;}public MyInt2(int myint){this.myint=myint;}}public class FunctionParameter{public static void main(String[] args){int a=10;int b=20;System.out.println("a in main="+a+" b in main="+b);swap(a, b);System.out.println("a in main="+a+" b in main="+b);Integer x=new Integer(40);Integer y=new Integer(50);System.out.println("x in main="+x+" y in main="+y);swap(x, y);System.out.println("x in main="+x+" y in main="+y);MyInt2 n=new MyInt2(13);MyInt2 m=new MyInt2(67);System.out.println(n.hashCode());System.out.println("n in main="+n.myint+" m in main="+m.myint);swap(n, m);System.out.println("n in main="+n.myint+" m in main="+m.myint);}public static void swap(int a,int b){a^=b;b^=a;a^=b;//方法内对基本类型的修改不影响 方法外面的形式参数System.out.println("a in fun1="+a+" b int fun1="+b);}public static void swap(Integer a,Integer b)//包装类会自动拆箱装箱,包装类参数还是    值传递{a^=b;b^=a;a^=b;//方法内对包装类形式参数的操作不影响 方法外面的实际参数System.out.println("a in fun2="+a+" b int fun2="+b);}//方法对引用类型的参数传递 是引用传递。形参是实参的引用,对形参的修改就是对实参的修改public static void swap(MyInt2 myInt1,MyInt2 myInt2){System.out.println(myInt1.hashCode());myInt1.myint^=myInt2.myint;myInt2.myint^=myInt1.myint;myInt1.myint^=myInt2.myint;System.out.println("myInt1 in fun3="+myInt1.myint+" myInt2 int fun3="+myInt2.myint);}}
结果:

a in main=10 b in main=20a in fun1=20 b int fun1=10a in main=10 b in main=20x in main=40 y in main=50a in fun2=50 b int fun2=40x in main=40 y in main=50366712642n in main=13 m in main=67366712642myInt1 in fun3=67 myInt2 int fun3=13n in main=67 m in main=13
总结:基本数据类型,形式参数与实际参数无关。

引用数据类型,对形式参数的操作就是对实际参数的操作。