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

关于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);
}

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

相关文章:

  • node.js如何实现双 Token + Cookie 存储 + 无感刷新机制
  • Frp Dockr Mysql内网映射
  • 乘法逆元:费马小定理(利用快速乘法幂)(JAVA)
  • JAVA批量发送邮件(含excel内容)
  • 在 Excel xll 自动注册操作 中使用东方仙盟软件2————仙盟创梦IDE
  • 算法打卡第三天
  • C#开发利器:SharpBoxesCore全解析
  • 49、c# 能⽤foreach 遍历访问的对象需满足什么条件?
  • Unity3D序列化机制详解
  • CMMI(能力成熟度模型集成)详解及5个级别案例
  • 平衡二叉树的判定:回溯法的深度解析与迭代法拓展
  • 台风灾害下考虑调节特性的多元资源紧急协调调度
  • vue3:十三、分类管理-表格--模糊查询搜索框
  • 腾讯位置服务重构出行行业的技术底层逻辑
  • Java SE 抽象类和接口(下)
  • 【题解-洛谷】B4240 [海淀区小学组 2025] 最短字符串
  • NIFI的处理器:ExecuteGroovyScript 2.4.0
  • C# AI(Trae工具+claude3.5-sonnet) 写前后端
  • A1-A2 英语学习系列 第五集
  • Java枚举详解
  • 新华时评:查查屋顶溜坡背后的“溜坡”
  • 中国戏剧梅花奖在上海揭晓,蓝天、朱洁静等15人摘梅
  • 演员辛柏青发讣告:妻子朱媛媛患癌去世
  • 中国建设银行原党委委员、副行长章更生被决定逮捕
  • 商务部新闻发言人就美国企图全球禁用中国先进计算芯片发表谈话
  • 中国华能:1-4月新能源装机突破1亿千瓦,利润总额再创新高