不使用第三变量交换两个变量的值
在 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;
这样就实现了两个变量值的交换。
更推荐这种方式,倒不因为这样写更高级,而是这样的二进制运算是最快的,执行效率最高。
天河有尽身作涯,星海无边前是岸。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)