java - XOR (^) 交换算法如何工作?

标签 java

这是一种无需第三个变量即可交换 a 和 b 的方法。我理解“异或”在真值表中“真”或“假”的含义,但它到底在做什么?当我们处理数字而不是 boolean 值时,XOR 如何工作?

int a = 5; int b = 10;

a = a ^ b;

b = a ^ b;

a = a ^ b;

最佳答案

该操作按位进行,每个数字的二进制编码中的每个位一次。

你玩过“Lights Out”这个游戏吗?每个灯要么打开,要么关闭,每次按下按钮都会交换(异或)它们的模式。如果您第二次按下该按钮,相同的交换会将图案更改回来。如果您按下按钮组合,也会出现同样的情况。相同的按钮组合会将其更改回来 - 顺序不必相同。

同样的行为发生在游戏中以及变量的按位运算中。当将两个变量异或在一起时,一个变量中的位用于切换另一个变量中的位。由于这一变化的性质,哪个在哪​​个上进行切换并不重要 - 结果是相同的。两个数字中相同位置的相同位在结果的该位置产生 0。相反的位在该位置产生 1。

a = a ^ b;

a 现在设置为 a 和 b 的组合位掩码。 b 仍然是原来的值。

b = a ^ b;

b 现在设置为 (a XOR b) 和 b 的组合位掩码。 b 被取消,所以现在 b 设置为 a 的原始值。 a 仍设置为 a 和 b 的组合位掩码。

a = a ^ b;

a 现在设置为 (a XOR b) 和 a 的组合位掩码。 (请记住,b 现在实际上包含 a 的原始值)a 被取消,因此 a 现在被设置为原始值b.

关于java - XOR (^) 交换算法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21093606/

相关文章:

java - 连接到具有多个客户端的服务器

java - 使用 JDBC 从 ORACLE 获取 CLOB 数据时出现 NotSerializedException

java - ActionListeners 不适用于模态 JDialog

java - 对象 ArrayList 反序列化后丢失 String 值?

java - Okhttp3 - RequestBody.create(contentType, content) 弃用

java - 检查单词拼写是否正确

java - Tomcat 应用程序未启动

java - 在 setter 方法中做其他事情是否被认为有副作用?

java - 如何将 XMLGregorianCalendar 时间生成为 UTC

通过对象调用Java接口(interface)方法