登录
首页 >  文章 >  java教程

怎么利用位运算符 ^ (异或) 在不使用额外中间变量的前提下交换两个整数的值

时间:2026-05-05 22:21:31 101浏览 收藏

大家好,今天本人给大家带来文章《怎么利用位运算符 ^ (异或) 在不使用额外中间变量的前提下交换两个整数的值》,文中内容主要涉及到,如果你对文章方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

异或交换法利用a^a=0、a^0=a及结合律,通过a^=b; b^=a; a^=b三步完成整数交换,但仅适用于不同地址的整数,不适用于浮点数或同一变量。

利用异或运算符 ^ 交换两个整数,核心在于异或的三个数学性质:

  • a ^ a = 0(相同数异或得 0)
  • a ^ 0 = a(任何数与 0 异或等于自身)
  • 异或满足交换律和结合律:a ^ b ^ c = (a ^ b) ^ c = a ^ (b ^ c)

交换过程推导(以 a 和 b 为例)

执行以下三步操作:

  • a = a ^ b → 此时 a 存的是 a^b,b 未变
  • b = a ^ b → 注意:这里的 a 是上一步结果(a^b),所以 b = (a^b) ^ b = a ^ (b^b) = a ^ 0 = a → b 现在等于原来的 a
  • a = a ^ b → 此时 a 是 a^b,b 是原 a,所以 a = (a^b) ^ a = b ^ (a^a) = b ^ 0 = b → a 现在等于原来的 b

代码示例(C/Java/Python 风格均适用)

假设初始 a = 5b = 9

a ^= b;  // a = 5 ^ 9 = 12<br>b ^= a;  // b = 9 ^ 12 = 5(恢复原 a)<br>a ^= b;  // a = 12 ^ 5 = 9(恢复原 b)

结束后:a = 9b = 5,完成交换。

注意事项与限制

  • 仅适用于整数类型(因为位运算是对二进制补码操作,浮点数、指针、对象等不适用)
  • 不能用于同一变量地址(如 a 和 b 指向同一内存):若 a == b(比如交换数组中同一个元素),则第一步 a ^= a → a = 0,后续全变 0,数据丢失
  • 现代编译器对普通临时变量交换(a,b = b,a)常做优化,异或技巧更多是理解位运算原理,实际工程中可读性不如传统方式

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《怎么利用位运算符 ^ (异或) 在不使用额外中间变量的前提下交换两个整数的值》文章吧,也可关注golang学习网公众号了解相关技术文章。

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>