java不使用第三变量交换两个变量的值

 更新时间:2024年04月25日 09:16:02   作者:天航星  
这篇文章主要介绍了java不使用第三变量交换两个变量的值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

不使用第三变量交换两个变量的值

在 Java 中,经常会需要交换两个变量的值,我们一般是使用第三变量完成

比如:

temp = a;
a = b;
b = temp;

这样的写法确实能达成目标,但因此而引入了第三变量,对资源的消耗增加了。

这里总结了两种不使用第三变量实现的方式

这两种方法仅为个人总结,不能断定只有这三种,非常希望大家能提出其他的方式,互相学习。

加减交换法

a = a + b;
b = a - b;
a = a - b;a = a + b;
b = a - b;
a = a - b;

这种方式还有更高级的写法:

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

这种写法确实达到了目标,但还只是数字层面的技巧,下面介绍一种计算机底层的方式。

异或运算法

异或运算平时用得较少,这里先介绍一下。

两个数进行异或运算,其实就是它们的二进制数每一位进行运算:相同为 0,不同为 1

0 ^ 0 = 0;1 ^ 0 = 1;0 ^ 1 = 1;1 ^ 1 = 0;

由此可以得出异或的 3 个特点:

  • 0 异或任何数 = 任何数
  • 1异或任何数 = 任何数取反
  • 任何数异或自己 = 把自己置0

异或的常见用途:

  • 使某些特定的位翻转

例如对数 10100001 的第 2 位和第 3 位翻转,则可以将该数与 00000110 进行异或运算:

10100001 ^ 00000110 = 10100111
  • 两个变量值的交换,而不必使用第三变量

这就是我们这里的需求了。

例如交换两个整数 a = 10100001,b = 00000110 的值, 可以这样实现:

a = a ^ b; // a = 10100111
b = b ^ a; // b = 10100001
a = a ^ b; // a = 00000110

以上过程等效于:

a = a ^ b;
b = b ^ a = b ^ ( a ^ b ) = a ^ b ^ b = a ^ 0 = a;
a = a ^ b = (a ^ b) ^ a = b ^ a ^ a = b ^ 0 = b;

这样就实现了两个变量值的交换。

更推荐这种方式,倒不因为这样写更高级,而是这样的二进制运算是最快的,执行效率最高。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Cloud Stream微服务消息框架原理及实例解析

    Spring Cloud Stream微服务消息框架原理及实例解析

    这篇文章主要介绍了Spring Cloud Stream微服务消息框架原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • SpringBoot中RabbitMQ集群的搭建详解

    SpringBoot中RabbitMQ集群的搭建详解

    单个的 RabbitMQ 肯定无法实现高可用,要想高可用,还得上集群。这篇文章主要介绍了SpringBoot中RabbitMQ集群的两种模式的搭建:普通集群搭建和镜像集群搭建,需要的朋友可以参考一下
    2021-12-12
  • SpringBoot集成MyBatis的三种方式

    SpringBoot集成MyBatis的三种方式

    Spring Boot与MyBatis的集成为Java开发者提供了一种简便而强大的方式来访问和操作数据库,在本文中,我们将深入解析Spring Boot集成MyBatis的多种方式,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2023-12-12
  • Selenium Webdriver实现截图功能的示例

    Selenium Webdriver实现截图功能的示例

    今天小编就为大家分享一篇Selenium Webdriver实现截图功能的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Spring Boot集成MinIO对象存储服务器操作步骤

    Spring Boot集成MinIO对象存储服务器操作步骤

    通过Spring Boot集成MinIO,你可以在应用中方便地进行文件的存储和管理,本文给大家分享Spring Boot集成MinIO对象存储服务器详细操作步骤,感兴趣的朋友一起看看吧
    2024-01-01
  • 解决SpringMVC拦截器path路径的坑

    解决SpringMVC拦截器path路径的坑

    这篇文章主要介绍了解决SpringMVC拦截器path路径的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java实现图书馆借阅系统

    Java实现图书馆借阅系统

    这篇文章主要为大家详细介绍了Java实现图书馆借阅系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • java开发MVC三层架构上再加一层Manager层原理详解

    java开发MVC三层架构上再加一层Manager层原理详解

    这篇文章主要为大家介绍了MVC三层架构中再加一层Manager层原理的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • Mybatis 中的一对一,一对多,多对多的配置原则示例代码

    Mybatis 中的一对一,一对多,多对多的配置原则示例代码

    这篇文章主要介绍了 Mybatis 中的一对一,一对多,多对多的配置原则示例代码,需要的朋友可以参考下
    2017-03-03
  • Spring Boot全局异常处理解析

    Spring Boot全局异常处理解析

    这篇文章主要为大家详细介绍了Spring Boot全局异常处理的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论