用异或运算符简化两个变量值得互换

本文介绍了一种不借助第三个变量实现两个变量值交换的方法,通过异或运算符完成值的互换,并提供了完整的Java代码示例及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码:
package oneday01;
 
import java.util.Scanner;
 
public class ExchangeValue {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入A的值: ");
long A = scan.nextLong();
System.out.println("请输入B的值:");
long B = scan.nextLong();
System.out.println("A = " + A + "\tB = " + B);
A = A ^ B;
B = B ^ A;
A = A ^ B;
System.out.println("A = " + A + "\tB = " + B);
}
}
运行结果如下:

其中下面的代码就是运用了异或运算符即  “^”:
A = A ^ B;
B = B ^ A;
A = A ^ B;
System.out.println("A = " + A + "\tB = " + B);
下面给大家详细解析一下:
1、a=a^b
2、b=(a^b)^b=a^(b^b)=a^1=a
3、a=a^b=(a^b)^a=(a^a)^b=1^b=b
### 关于异或运算符 #### 定义与基本概念 异或(XOR 或者 `^`)是一种基于二进制的位运算,它对两个操作数的每一位执行比较。如果两位相同,则结果为 0;如果不同,则结果为 1[^1]。 #### 运算规则 对于任意两个二进制位 A 和 B 的异或运算: - 如果 A = B,则结果为 0; - 如果 A ≠ B,则结果为 1。 简单来说,异或可以看作一种“不进位加法”,例如: - 1 XOR 1 = 0 - 0 XOR 0 = 0 - 1 XOR 0 = 1 #### 示例代码 以下是 C 语言中的一个例子,展示如何使用异或运算: ```c #include <stdio.h> int main() { int a = 5; // 二进制:0101 int b = 3; // 二进制:0011 int result = a ^ b; printf("Result of %d ^ %d is %d\n", a, b, result); // 输出 Result of 5 ^ 3 is 6 return 0; } ``` 在这个例子中,变量 `result` 存储的是 `a` 和 `b` 的逐位异或结果。具体计算过程如下: - 5 的二进制形式是 `0101`, - 3 的二进制形式是 `0011`, - 对应位置上的比特进行异或运算后得到的结果是 `0110`,即十进制的 6。 #### 应用场景 ##### 找到数组中唯一出现一次的数字 利用异或运算一个重要性质——任何数与其本身异或都等于 0 (`A ^ A = 0`),以及任何数与 0 异或都等于该数本身 (`A ^ 0 = A`),可以在 O(n) 时间复杂度下找到数组中只出现一次的那个数。下面是一个 JavaScript 实现的例子: ```javascript var findUniqueElement = function(nums) { let unique = 0; for (let num of nums) { unique ^= num; } return unique; }; // 测试案例 const array = [2, 3, 2, 4, 4]; console.log(findUniqueElement(array)); // 输出 3 ``` 上述代码通过遍历整个数组并不断累积异或来实现目标。最终剩下的那个数就是仅出现过一次的元素[^3]。 #### 数学解释及其扩展应用 除了用于查找单一独特外,还可以用来交换两个整型变量而无需额外空间支持。比如,在 Java 中可以通过以下方式完成两数互换: ```java public class SwapExample { public static void main(String[] args){ int x = 7, y = 8; System.out.println("Before swapping:"); System.out.printf("x=%d, y=%d%n", x, y); x = x ^ y; y = x ^ y; x = x ^ y; System.out.println("After swapping:"); System.out.printf("x=%d, y=%d%n", x, y); } } ``` 这里的关键在于每次赋都会改变其中一个变量的状态直到它们完全颠倒过来为止[^4]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

干货无水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值