0

0

C++怎么用位运算 C++中异或运算交换变量方法【重点】

穿越時空

穿越時空

发布时间:2026-03-11 19:40:02

|

356人浏览过

|

来源于php中文网

原创

异或交换仅适用于地址不同、平凡可复制的整型变量,需防护自交换和类型不匹配;std::swap更安全通用,现代编译器下性能相当且支持用户类型与adl。

c++怎么用位运算 c++中异或运算交换变量方法【重点】

^ 交换两个整型变量,前提是不能用临时变量

异或交换法成立的前提是:两个变量地址不同、且都是整型(或可按位操作的标量类型)。它利用 a ^ a == 0a ^ 0 == a 这两条性质推导出:a = a ^ b; b = a ^ b; a = a ^ b; 三步后完成交换。

常见错误现象:ab 是同一个变量(比如传入 swap(x, x)),此时第一步就把值变没了,最后得到全 0。C++ 标准不保证这种自交换行为,实际结果依赖编译器优化和寄存器分配,多数情况下出错。

  • 只适用于 intshortchar 等整型,浮点数、指针、类对象不能直接用 ^
  • 如果变量是 volatile 或位于内存映射 I/O 地址,多次读写可能触发副作用,不能用
  • 现代编译器对 std::swap 优化极好,异或写法反而可能阻碍优化(比如破坏寄存器复用)

std::swap 和异或写法在性能与安全上的实际差异

在开启 O2 优化的 Clang/GCC 下,std::swap 对内置类型通常被内联为 3 条 xor 汇编指令,和手写异或完全一致;但对用户类型(如 std::vector),它会走移动语义,而异或根本无法编译通过。

容易踩的坑:有人把异或写成宏或模板试图“通用化”,比如 #define SWAP(a,b) a^=b,b^=a,a^=b,但若 a 是表达式(如 *p++),宏会展开成多次求值,导致指针错位或未定义行为。

立即学习C++免费学习笔记(深入)”;

皮卡智能
皮卡智能

AI驱动高效视觉设计平台

下载
  • 异或交换没有类型检查,charint 混用会静默截断
  • std::swap 支持 ADL(参数依赖查找),能自动调用用户为自定义类型重载的 swap
  • 在调试模式下,异或写法单步跟踪时逻辑难读,中间态全是“无意义”的异或结果

哪些场景真该用手写异或?几乎不存在

嵌入式裸机开发中,若栈空间极度紧张、又确定只交换两个 uint8_t 变量,且编译器连 std::swap 都没启用(比如用 C++98 + 手写头文件),才可能考虑。但更现实的做法是关掉异常/RTTI,让 std::swap 编译出来就是三条 xor

典型误用:在面试题里硬套异或交换,却忽略 std::swapstd::arraystd::pair 的完美转发支持——这些类型用异或根本没法写。

  • 异或交换无法处理引用、const 限定符、bit-field 成员
  • Clang 的 -Wxor-used-as-pow 警告虽不针对此,但说明编译器对 ^ 的语义敏感度远高于开发者直觉
  • LLVM IR 层面,std::swap 更易被识别为“交换”意图,利于后续向量化或寄存器分配

真要写异或交换,必须加的防护条件

如果因历史代码约束或教学演示必须保留异或写法,至少得确保不会拿同一个地址操作。可用 std::addressof 做运行时检查(仅调试版):

if (std::addressof(a) == std::addressof(b)) return; // 防自交换

但这只是补救,不是替代方案。真正关键的是:确认类型是平凡可复制(std::is_trivially_copyable_v<t></t>),且不涉及对齐敏感访问(比如 __attribute__((packed)) 结构体成员)。

  • 不要对 bool 用异或交换——它可能被编译器打包成 bit,^ 操作未定义
  • 避免在多线程环境下对同一变量做无锁异或交换,缺少内存序约束
  • 即使满足所有条件,也应在注释里写明:“仅限 POD 整型,已验证地址不等”

异或交换的边界比看起来窄得多,稍一越界就是未定义行为,而 std::swap 的边界由标准明确定义。事情说清了就结束。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

119

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

386

2023.10.11

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

490

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

202

2025.07.04

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

490

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

202

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.1万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号