不使用第三变量交换两个变量的值
在 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;
这样就实现了两个变量值的交换。
更推荐这种方式,倒不因为这样写更高级,而是这样的二进制运算是最快的,执行效率最高。
不使用第三变量交换两个变量的值相关推荐
- php比较两个变量的值_总结PHP不用第三个变量交换两个变量的值的几种方法
"PHP不用第三个变量交换两个变量的值"这个题看到过好多次了,看来面试确实喜欢考这道题.今天,对于这个题目,我自己总结了几种方法,可能不全,大家来互相补充. 有些仅适用于字符串,方 ...
- C++不借助第三变量交换两个变量的值
C++不借助第三变量交换两个变量的值 源代码: #include<iostream> using namespace std; int main(){int x,y;cout<< ...
- 不用额外变量交换两个整数的值
题目 如何不用任何额外变量交换两个整数的值 基本思路 如果给定整数a和b使用如下三行代码即可交换a和b的值: a = a ^ b b = a ^ b a = a ^ b 如何理解这三行代码的具体功能呢 ...
- PHP中不用第三个变量交换两个变量的值
相信大家在PHP面试或者学习中经常会遇到这个问题就是"不用第三个变量来交换两个变量的值",今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个 ...
- 不使用第三个变量交换两个变量的值
小结一下: 给出两个变量:var a = 1, b = 2; 方法一: a = a + b; b = a - b; a = a - b; a, b 的值已经交换. 方法二: a = a ^ b; b ...
- 不用引入第三变量交换两个变量的值
前几天发现了一个问题:有人告诉我,要进行变量交换,就必须引入第三变量! 假设我们要交换a和b变量的值,如果写成 int a=5,b=10; a=b; b=a; 那么结果就是两个都是10,理由不言而喻. ...
- 不借助第三方变量交换两个变量的值(多种方法)
转载自:https://blog.csdn.net/kangkermit/article/details/21371159 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码 ...
- 不允许创建临时变量交换两个变量的内容
在学习C语言的时候,涉及到两个变量值的交换,其中用到临时变量.如果在没有临时变量的情况下,该如何做呢? 方法一:C语言提供的异或运算就可以实现这样的操作.异或运算符"^"也称&qu ...
- 不使用第三个变量交换两个变量
#include<iostream> using namespace std; int main() { int a,b; cin>>a; cin> ...
最新文章
- android UI设计时须要注意遵循的设计原则
- 《火球——UML大战需求分析》(第1章 大话UML)——1.5 小结和练习
- 什么是WebSocket,以及如何在Python中使用它?
- cublas matlab,Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0) CUBLAS_STATUS_MAPPING_ERROR
- C 和 C++ 不安全?Android 支持 Rust 开发操作系统
- Servlet打印HTML页面乱码问题
- 大连理工大学计算机科学世界排名,喜忧参半!2021年5月ESI世界大学排行榜,21个学科排名数据分析!...
- IIC控制设计读写EEPROM
- DataGrid分页(1)
- HTML:select、option中设置默认值,且默认值不在下拉框中出现
- Excel、Word VBA 学习笔记
- gpio引脚介绍 树莓派3b_树莓派引脚对照表
- 2022年字节跳动日常实习面经(抖音)
- 海科融通:关于降低商户银行卡刷卡手续费的公告
- 关于 reached end of file while parsing
- 区块链市场——专为用户打造的一站式应用下载平台
- Redis源码阅读,从入门到放弃
- 计算机应用基础实训室,计算机应用基础实训
- 从软件到片源!PC播放HDTV上手全攻略
- configfile