java 使用异或运算交换

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, float
		
		double aDouble=1.23;
		double bDouble=4.56;
//		aDouble^=bDouble;
		//The operator ^= is undefined for the argument type(s) double, double
	
	}
}
结果:

aByte=1 bByte=2
aByte=2 bByte=1
---------------------------------
aShort=3 bShort=4
aShort=4 bShort=3
---------------------------------
aInt=5 bInt=6
aInt=6 bInt=5
---------------------------------
aLong=7,bLong=8
aLong=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=20
a in fun1=20 b int fun1=10
a in main=10 b in main=20
x in main=40 y in main=50
a in fun2=50 b int fun2=40
x in main=40 y in main=50
366712642
n in main=13 m in main=67
366712642
myInt1 in fun3=67 myInt2 int fun3=13
n in main=67 m in main=13
总结:基本数据类型,形式参数与实际参数无关。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值