交换两数异或方法和临时变量方法对比
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-04-17基于SpringWeb MultipartFile文件上传、下载功能
- 2024-04-14个人开发者,Spring Boot 项目如何部署
- 2024-04-14RAG应用开发实战02-相似性检索的关键 - Embedding
- 2024-04-14出海软件草根逆袭打法是什么?
- 2024-04-13鸿蒙原生应用再新丁!企查查 碧蓝航线 入局鸿蒙
- 2024-04-11RAG应用开发实战(01)-RAG应用框架和解析器
- 2024-04-10DevOps已死?2024年的DevOps将如何发展
- 2024-04-10码农必看:常见源代码混淆技术详解
- 2024-04-07以一当十丨TiDB 在东吴证券秀财 APP 的应用实践
- 2024-04-07月活超 1.1 亿,用户超 4 亿,你也在用的「知乎」是如何在超大规模 TiDB 集群上玩转多云多活的?来听听知乎代晓磊的答案!