java位运算符实现数字交换_八种方法(实现两个数互换),绝了绝了!

实现两个数互换的八种方法

基本数据类型

借助第三个变量

package 贪心;/*

作者     :XiangLin

创建时间 :2020/9/15 22:48

文件     :XX.java

IDE      :IntelliJ IDEA

*/

import java.util.Random;

public class Exchange1{

public static void main(String[] args){

/**

* 随机生成两个固定序列的0-100之间的整数,

* 其中101表示生成的数范围区间在:[0-101)

*/

Random random = new Random(47);

int a = random.nextInt(101);

int b = random.nextInt(101);

System.out.println("交换前:a = " + a + ", b = " + b);

/**

* 借助第三个变量实现第三个数互换

*/

int t = a; // t == a

a = b;     // a == b

b = t;     // b == t == a

System.out.println("交换后:a = " + a + ", b = " + b);

}

}

控制台输出如下:

d410dcb38d2cbb51ac9161729b84b0a6.png

如果有不明白的朋友,可以自己准备三个杯子,一个空杯代表变量t,两个杯子装上水分别代表变量a、b,然后互换一下a、b两个杯子里的水即可明白。

d23b250319505541c9f63ffc77a40a55.png

不借助第三个变量

package 贪心;/*

作者     :XiangLin

创建时间 :2020/9/15 22:51

文件     :cccc.java

IDE      :IntelliJ IDEA

*/

import java.util.Random;

public class Exchange2{

public static void main(String[] args){

/**

* 随机生成两个固定序列的0-100之间的整数,

* 其中101表示生成的数范围区间在:[0-101)

*/

Random random = new Random(48);

int a = random.nextInt(101);

int b = random.nextInt(101);

System.out.println("交换前:a = " + a + ", b = " + b);

a = a + b; // a == a + b

b = a - b; // b == a + b - b == a, 此时b == a

a = a - b; // a == a + b - a == b, 此时a == b

System.out.println("交换后:a = " + a + ", b = " + b);

}

}

控制台输出如下:

285bd0261fec3a73fd2751fb894bedb1.png

通过乘除操作实现两个数互换

package 贪心;/*

作者     :XiangLin

创建时间 :2020/9/15 22:54

文件     :xxx.java

IDE      :IntelliJ IDEA

*/

import java.util.Random;

public class Exchange3{

public static void main(String[] args){

/**

* 随机生成两个固定序列的0-100之间的整数,

* 其中101表示生成的数范围区间在:[0-101)

*/

Random random = new Random(50);

int a = random.nextInt(101);

int b = random.nextInt(101);

System.out.println("交换前:a = " + a + ", b = " + b);

a = a * b; // 此时a == a * b

b = a / b; // b == a * b / b == a, 此时b == a

a = a / b; // a == a * b / a == b, 此时a == b

System.out.println("交换后:a = " + a + ", b = " + b);

}

}

Output:

ccad9a4706090f52e73b7c5aef612d14.png

利用赋值运算符

因为这两种方法是笔者后面补充的,所以第七种和第八种方法放在前面

利用赋值和加减来实现两个数互换

package 贪心;/*

作者     :XiangLin

创建时间 :2020/9/15 22:58

文件     :xx.java

IDE      :IntelliJ IDEA

*/

public class Exchange7{

public static void main(String[] args){

/**

*  随机生成两个0-100之间的整数,

*  其中Math.random()会生成[0-1)之间任意的double类型的数

*  因此101表示生成的数范围区间在:[0-101)

*/

int a = (int) (Math.random() * 101);

int b = (int) (Math.random() * 101);

System.out.println("交换前: a = " + a + ", b = " + b);

a = b + a - (b = a); // a == b + a - a == b, a == b

System.out.println("交换后: a = " + a + ", b = " + b);

}

}

控制台输出如下:

ca54afc924554f6e7e876647571983aa.png

利用赋值和加乘来实现两个数互换

package 贪心;/*

作者     :XiangLin

创建时间 :2020/9/15 23:00

文件     :xxx.java

IDE      :IntelliJ IDEA

*/

public class Exchange8{

public static void main(String[] args){

/**

*  随机生成两个0-100之间的整数,

*  其中Math.random()会生成[0-1)之间任意的double类型的数

*  因此101表示生成的数范围区间在:[0-101)

*/

int a = (int) (Math.random() * 101);

int b = (int) (Math.random() * 101);

System.out.println("交换前: a = " + a + ", b = " + b);

a = b + (b = a) * 0; // a == b + a * 0 == b, a == b

System.out.println("交换后: a = " + a + ", b = " + b);

}

}

控制台输出如下:

f4f08133a74baf264db2fececb1fed51.png

异或

在介绍第四种方法之前,首先要跟大家介绍一下Java中的"异或"操作符(^)。

异或操作符是Java中按位操作符的一种,那么什么是按位操作符呢?

按位操作符用来操作整数基本数据类型中的单个"比特"(bit),即二进制位。我们都知道,计算机中是采用二进制计数,而不是十进制计数。也就是说,计算机中没有我们所谓的2、3、4、5 … 100 … 1000 … ,计算机中有的只是0和1,逢二便进一。而按位操作符会对两个参数中对应的位,也就是对用二进制表示的两个参数相对应的0或1,执行布尔代数运算,并最终生成一个结果。

当然在Java中我们一般运用按位操作符很少,而我们最开始接触按位操作符,很可能是从C语言或者数字逻辑与电路。事实上,按位操作符来源于C语言面向底层的操作,这种操作经常需要直接操纵硬件,设置硬件寄存器内的二进制位。而Java的设计初衷是嵌入电视机机顶盒内,所以这种面向底层的操作被保留了下来。Java技术的三大版本之一:JavaME,Java平台微型版正是用作嵌入式开发,用来开发数字机顶盒、可视电话等电子设备。

了解了按位操作符的概念,那么接下来,我们来了解"异或"操作

如a ^ b,若a、b两个值不同,则异或结果为1;若a、b两个数相同,则异或结果为0。

大家如果要记忆的话,可以记住六字真言:同为0,异为1。

或者明白或运算的朋友也可以通过字面意思来理解,若两数相异(要么是0和1,要么是1和0),则执行或运算;若两数相同(同为0,或同为1),则结果为0。

如果还是有点抽象的话,没得事,直接上代码:

package 贪心;/*

作者     :XiangLin

创建时间 :2020/9/15 23:05

文件     :xxx.java

IDE      :IntelliJ IDEA

*/

public class Test{

public static void main(String[] args){

/**

* 分别把结果以二进制的形式输出

*/

System.out.println("3的二进制:" + Integer.toBinaryString(3));

System.out.println("4的二进制:" + Integer.toBinaryString(4));

System.out.println("3 ^ 3 的二进制:" + Integer.toBinaryString(3 ^ 3));

System.out.print("3 ^ 0 的二进制:" + Integer.toBinaryString(3 ^ 0));

if (3 == (3 ^ 0))

System.out.println(",也就是十进制的3");

System.out.print("4 ^ 3 ^ 3 的二进制:" + Integer.toBinaryString(4 ^ 3 ^ 3));

if (4 == (4 ^ 3 ^ 3))

System.out.println(",也就是十进制的4");

}

}

Output:

2e584727a6472753362a6aeeab7b04a1.png

好戏开场,通过异或操作实现两个数互换

package 贪心;/*

作者     :XiangLin

创建时间 :2020/9/15 23:08

文件     :xx.java

IDE      :IntelliJ IDEA

*/

import java.util.Random;

public class Exchange4{

public static void main(String[] args){

/**

* 随机生成两个固定序列的0-100之间的整数,

* 其中101表示生成的数范围区间在:[0-101)

*/

Random random = new Random(51);

int a = random.nextInt(101);

int b = random.nextInt(101);

System.out.println("交换前:a = " + a + ", b = " + b);

a = a ^ b; // 此时, a == a ^ b

b = a ^ b; // b == a ^ b ^ b == a, 此时b == a

a = a ^ b; // a == a ^ b ^ a == b, 此时a == b

System.out.println("交换后:a = " + a + ", b = " + b);

}

}

Output:

860cc26624f3c531c3995bf2fbf8fbc8.png

引用数据类型

想必大家已经学了四种方法,已经对两个数互换信心满满,那么接下来,我们来看一道面试题:

package 贪心;/*

作者     :XiangLin

创建时间 :2020/9/15 23:10

文件     :xx.java

IDE      :IntelliJ IDEA

*/

public class Exchange5{

public static void main(String[] args){

Integer a = 10;

Integer b = 20;

swop(a, b);

// 打印结果:a = 20, b = 10

System.out.println("a = " + a + ", b = " + b);

}

private static void swop(Integer a, Integer b){

// 完成此处代码

}

}

如代码所示,完成指定位置的代码,使得程序最后的运行结果为:a = 20, b = 10

你可能觉得这还不简单,然后"刷刷刷"完成可能如以下的代码:

private static void swop(Integer a, Integer b){

a = a ^ b;

b = a ^ b;

a = a ^ b;

}

然后再看输出结果就傻眼了:

14979c0e5c808588a3ec8ecce0451347.png

纳尼,不变?这是为什么?想知道为什么的可能需要自行了解一下Java内存模型了,毕竟Java里面没有C语言的指针(小声bb)。当然,本博主以后可能也会出这方面的博客。

下面让我来揭晓正确答案吧!

private static void swop(Integer a, Integer b) throws NoSuchFieldException, IllegalAccessException{

// 完成此处代码

//        a = a ^ b;

//        b = a ^ b;

//        a = a ^ b;

int x = a;

int y = b;

// 运用反射来操作Integer

Class c = Integer.class;

Field field = c.getDeclaredField("value");

// 授权访问私有

field.setAccessible(true);

// 将 a、b的值分别设置为y、x的值

field.setInt(a, y);

field.setInt(b, x);

}

当当当当,控制台输出如下:

0dc1b5acf2ff1255449f155fad803f34.png

至于如果有朋友想了解反射的知识,可以关注我的博客哦!毕竟反射是我当年学习JavaSE知识觉得最神奇也最喜欢的三个知识之一。

至于第六种方法嘛:

private static void swop(Integer a, Integer b){

System.out.println("a = " + b + ", b = " + a);

// 终止Java虚拟机的运作

System.exit(0);

}

哈哈,不要打我哦,我就皮这一下…

毕竟,题目只是说,使得运行结果为:a = 20, b = 10 即可(^_−)☆

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值