交换两数异或方法和临时变量方法对比
2022/8/5 23:22:42
本文主要是介绍交换两数异或方法和临时变量方法对比,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
交换两数异或方法和临时变量方法对比
异或运算法
void swap(int &a, int &b) { a = a^b; b = a^b; a = a^b; }
临时变量方法
void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; }
异或方法的缺点
对于临时变量法,每次赋值只要读取一个变量的值到寄存器,
然后再从寄存器写回到另一个变量中即可,前后涉及两次内存写入操作;
但是对于异或运算操作,每次都需要读取两个数据到寄存器中,再进行运算操作,
之后把结果写回到变量中,前后共需要三次内存写入操作。
另外一点,异或操作的代码可读性差。
理论上是临时变量法快,实际呢,可以编一段代码测试一下:
void XorSwapTest() { int i = 3; int j = 5; for (int x = 0;x < 100000000;x++) { i = i ^ j; j = i ^ j; i = i ^ j; } } void TmpSwapTest() { int i = 3; int j = 5; for (int x = 0;x < 100000000;x++) { int k = i; i = j; j = k; } }
对比通过xor方法交换数值,和通过临时变量方法交换数值哪个更快:
循环100000000次,测试了两次,
第一次:
XOR 18:51:30:5509->18:51:31:0609 =5100
TMP 18:51:31:0609->18:51:31:2879 =2270
第二次
XOR 18:53:39:7497->18:53:40:2087 =4590
MP 18:53:40:2087->18:53:40:4457 =2370
可以发现,临时变量方法确实比异或方法快,异或方法多用时一倍多
异或方法的隐患
在交换数组元素时,下标为i和j的元素,导致有一种情况,当i == j时:
swap(data[i], data[j]);
在执行了 arr[i] = arr[i] ^ arr[j] 后,arr[i] = arr[j] = 0。
就有问题了。
这篇关于交换两数异或方法和临时变量方法对比的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?