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

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

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

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

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

加减交换法

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;

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

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

不使用第三变量交换两个变量的值相关推荐

  1. php比较两个变量的值_总结PHP不用第三个变量交换两个变量的值的几种方法

    "PHP不用第三个变量交换两个变量的值"这个题看到过好多次了,看来面试确实喜欢考这道题.今天,对于这个题目,我自己总结了几种方法,可能不全,大家来互相补充. 有些仅适用于字符串,方 ...

  2. C++不借助第三变量交换两个变量的值

    C++不借助第三变量交换两个变量的值 源代码: #include<iostream> using namespace std; int main(){int x,y;cout<< ...

  3. 不用额外变量交换两个整数的值

    题目 如何不用任何额外变量交换两个整数的值 基本思路 如果给定整数a和b使用如下三行代码即可交换a和b的值: a = a ^ b b = a ^ b a = a ^ b 如何理解这三行代码的具体功能呢 ...

  4. PHP中不用第三个变量交换两个变量的值

    相信大家在PHP面试或者学习中经常会遇到这个问题就是"不用第三个变量来交换两个变量的值",今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个 ...

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

    小结一下: 给出两个变量:var a = 1, b = 2; 方法一: a = a + b; b = a - b; a = a - b; a, b 的值已经交换. 方法二: a = a ^ b; b ...

  6. 不用引入第三变量交换两个变量的值

    前几天发现了一个问题:有人告诉我,要进行变量交换,就必须引入第三变量! 假设我们要交换a和b变量的值,如果写成 int a=5,b=10; a=b; b=a; 那么结果就是两个都是10,理由不言而喻. ...

  7. 不借助第三方变量交换两个变量的值(多种方法)

    转载自:https://blog.csdn.net/kangkermit/article/details/21371159 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码 ...

  8. 不允许创建临时变量交换两个变量的内容

    在学习C语言的时候,涉及到两个变量值的交换,其中用到临时变量.如果在没有临时变量的情况下,该如何做呢? 方法一:C语言提供的异或运算就可以实现这样的操作.异或运算符"^"也称&qu ...

  9. 不使用第三个变量交换两个变量

    #include<iostream> using namespace std; int main() {     int a,b;     cin>>a;     cin> ...

最新文章

  1. android UI设计时须要注意遵循的设计原则
  2. 《火球——UML大战需求分析》(第1章 大话UML)——1.5 小结和练习
  3. 什么是WebSocket,以及如何在Python中使用它?
  4. cublas matlab,Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0) CUBLAS_STATUS_MAPPING_ERROR
  5. C 和 C++ 不安全?Android 支持 Rust 开发操作系统
  6. Servlet打印HTML页面乱码问题
  7. 大连理工大学计算机科学世界排名,喜忧参半!2021年5月ESI世界大学排行榜,21个学科排名数据分析!...
  8. IIC控制设计读写EEPROM
  9. DataGrid分页(1)
  10. HTML:select、option中设置默认值,且默认值不在下拉框中出现
  11. Excel、Word VBA 学习笔记
  12. gpio引脚介绍 树莓派3b_树莓派引脚对照表
  13. 2022年字节跳动日常实习面经(抖音)
  14. 海科融通:关于降低商户银行卡刷卡手续费的公告
  15. 关于 reached end of file while parsing
  16. 区块链市场——专为用户打造的一站式应用下载平台
  17. Redis源码阅读,从入门到放弃
  18. 计算机应用基础实训室,计算机应用基础实训
  19. 从软件到片源!PC播放HDTV上手全攻略
  20. configfile

热门文章

  1. 微信经典飞机大战之二:飞机起飞(背景滚动)
  2. ajax定时轮询机制图解,通过Ajax调用的轮询机制
  3. Windows关闭123、137、138、139、445、1900等端口监听指引
  4. 测试报告编写,测试结果编写
  5. 前端在vue2中嵌入腾讯地图(web端)
  6. 不同VLAN之间互相通信
  7. Tomcat详细介绍和使用总结
  8. 第35期代谢组学暨多元变量统计分析培训班招生啦!
  9. 开源作品-PHP写的Redis管理工具(单文件绿色版)-SuRedisAdmin_PHP_1_0
  10. 【转载】CAD快捷键