当前位置: 首页 > backend >正文

关于C++使用位运算交换变量值的分析

1、使用临时变量交换

交换变量的值,最常见的方法就是用临时变量。

void swap1(int& a, int& b){int c = a;a = b;b = c;
}

清晰明了。

2、位运算版

对于整数类型,相信很多人都见过下面方法,可以使用位运算,从而不借用临时变量

void swap2(int& a, int& b){a ^= b;b ^= a;a ^= b;
}

逻辑上相当于

void swap2(int& a, int& b){int c = a ^ b;int d = b ^ c; 	// == b ^ (a ^ b); int e = c ^ d;  // == (a ^ b) ^ (b ^ (a ^ b));b = d;a = e;
}

根据异或性质,显然成立。
甚至能写成一行 a ^= b ^= a ^= b;

3、分析

可能有人觉得,CPU处理位运算很快,位运算版还没有使用额外变量,所以位运算版效率更高
但是,这是错误的观念,swap2 比 swap1 效率低很多,这是因为虽然CPU处理位运算很快,但那是位运算和加减乘除比,要是和纯赋值比,你位运算还得往后稍稍,编译成汇编指令后,位运算版既要赋值,又要计算异或运算,指令数比版本1多的多。
我们来对比一下:
在这里插入图片描述
图中,明显能看到,位运算版实际效率很低。

其他问题

  • 位运算版只能应用于整数(能进行比特异或的类型)
  • 如果参数 a, b 为同一变量,则结果会出错。swap2(a, a) 或导致 a 的值变成 0。
    因此,位运算版交换 几乎没有优点可言,任何情况下,都不建议使用此方式进行变量交换。

4、通用版swap

template<typename T>
void swap(T& a, T& b){T c = std::move(a);a = std::move(b);b = std::move(c);
}

使用移动语义进行变量转移。

http://www.xdnf.cn/news/7942.html

相关文章:

  • Vue学习记录
  • docker面试题(5)
  • LeetCode 1004. 最大连续1的个数 III
  • PH热榜 | 2025-05-21
  • 影刀Fun叉鸟-打刀刀
  • PyTorch的基本操作
  • 5月21日星期三今日早报简报微语报早读
  • 架构的设计
  • WebGL2混合与雾
  • tshark的使用技巧(wireshark的命令行,类似tcpdump):转换格式,设置filter
  • ARM64虚拟地址到物理地址转换页表映射过程--基于crash
  • 系统工程与一般系统理论 | 技术 / 应用 / 跨领域认知融合
  • 《AI工程技术栈》:三层结构解析,AI工程如何区别于ML工程与全栈工程
  • 精益数据分析(75/126):用户反馈的科学解读与试验驱动迭代——Rally的双向验证方法论
  • PEFT库PromptTuningConfig 配置
  • HarmonyOS NEXT端云一体化工程目录结构
  • ping、tcpping、psping、paping、hping的区别
  • 堆排序的两种建堆方式
  • 各类时钟源对比
  • sqlalchemy常用的数据类型
  • 浅谈mRNA的量与蛋白表达量不线性相关的原因(二)
  • C语言接收数据、解析数据帧,解决丢包粘包问题
  • 深入理解用于中断控制的 NVIC 寄存器
  • Python Day28 学习
  • 小白成长之路-Linux磁盘管理(二)
  • 香橙派3B学习笔记1:Putty串口_WIFI连接_SSH远程登录_网线连接
  • 精准识别记忆细胞!Elabscience PE Anti-Human/Mouse CD44 抗原特异性抗体
  • Proxmox 主机与虚拟机全部断网问题排查与解决记录
  • LabVIEW中EtherCAT从站拓扑离线创建及信息查询
  • Venom: 1靶场