ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-05-10 23:32:25  阅读:130  来源: 互联网

标签:变量 交换 00000110 第三 10100001 异或 运算


在 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;

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

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

标签:变量,交换,00000110,第三,10100001,异或,运算
来源: https://www.cnblogs.com/codesail/p/16256011.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有