两个二进制数的异或结果是什么?
参考回答
两个二进制数的异或(XOR)操作是按位比较的,结果遵循以下规则:
- 相同位异或结果为 0:0 ⊕ 0 = 0,1 ⊕ 1 = 0
- 不同位异或结果为 1:0 ⊕ 1 = 1,1 ⊕ 0 = 1
异或的本质:判断两位是否不同,不同为 1,相同为 0。
详细讲解与拓展
1. 异或的基本性质
- 自反性:
- 任意数与 0 异或等于自身: a⊕0=aa \oplus 0 = a
- 对称性:
- 任意数与自身异或等于 0: a⊕a=0a \oplus a = 0
- 结合律:
- 异或操作可以按任意顺序组合: a⊕b⊕c=(a⊕b)⊕c=a⊕(b⊕c)a \oplus b \oplus c = (a \oplus b) \oplus c = a \oplus (b \oplus c)
- 交换律:
- 异或操作可以交换操作数: a⊕b=b⊕aa \oplus b = b \oplus a
- 逆运算:
- 异或运算的逆运算仍然是异或本身: a⊕b⊕b=aa \oplus b \oplus b = a
2. 按位异或的过程
假设有两个二进制数 A
和 B
:
- A = 1101
- B = 1011
两者按位异或的结果是:
1101 (A)
⊕ 1011 (B)
--------
0110 (结果)
解释:
- 第一位:1 ⊕ 1 = 0
- 第二位:1 ⊕ 0 = 1
- 第三位:0 ⊕ 1 = 1
- 第四位:1 ⊕ 1 = 0
结果为 0110。
3. 异或的用途
- 二进制加密
- 异或是一种简单的加密方式。
- 加密:
C = M ⊕ K
(密文 = 明文 ⊕ 密钥) - 解密:
M = C ⊕ K
(明文 = 密文 ⊕ 密钥)
- 交换两个变量的值(不使用额外变量)
- 使用异或运算可以在不使用临时变量的情况下交换两个变量的值:
“`java
int a = 5, b = 3;
a = a ^ b; // a = 5 ⊕ 3
b = a ^ b; // b = (5 ⊕ 3) ⊕ 3 = 5
a = a ^ b; // a = (5 ⊕ 3) ⊕ 5 = 3
System.out.println("a = " + a + ", b = " + b); // 输出 a = 3, b = 5
“`
- 查找唯一出现的元素
-
在一个数组中,其他数字都出现了两次,只有一个数字出现了一次,可以使用异或快速找出这个数字:
“`java
int[] nums = {2, 3, 2, 4, 3};
int result = 0;
for (int num : nums) {
result ^= num; // 按位异或
}
System.out.println(result); // 输出 4
“`
- 计算汉明距离
-
汉明距离是两个二进制数中不同位的个数,可以通过异或得到:
“`java
int x = 4, y = 1; // 4 = 100, 1 = 001
int xor = x ^ y; // xor = 101
int distance = Integer.bitCount(xor); // 计算 1 的个数
System.out.println(distance); // 输出 2
“`
4. 异或运算的特性总结
特性 | 公式 | 解释 |
---|---|---|
与 0 异或 | a⊕0=aa \oplus 0 = a | 任意数与 0 异或等于自身 |
与自身异或 | a⊕a=0a \oplus a = 0 | 任意数与自身异或等于 0 |
交换律 | a⊕b=b⊕aa \oplus b = b \oplus a | 异或运算的顺序可以交换 |
结合律 | (a⊕b)⊕c=a⊕(b⊕c)(a \oplus b) \oplus c = a \oplus (b \oplus c) | 计算顺序无影响 |
自反性(逆运算) | a⊕b⊕b=aa \oplus b \oplus b = a | 异或运算可以还原原数 |
5. 示例代码
以下代码演示了异或的特性和常见用途:
public class XORExample {
public static void main(String[] args) {
// 按位异或
int a = 5; // 二进制:101
int b = 3; // 二进制:011
int xor = a ^ b; // 二进制:110
System.out.println("a ^ b = " + xor); // 输出 6
// 异或的逆运算
System.out.println("xor ^ b = " + (xor ^ b)); // 输出 5
// 交换两个变量的值
int x = 7, y = 10;
x = x ^ y;
y = x ^ y;
x = x ^ y;
System.out.println("x = " + x + ", y = " + y); // 输出 x = 10, y = 7
// 数组中唯一出现的数字
int[] nums = {1, 2, 3, 2, 1};
int result = 0;
for (int num : nums) {
result ^= num;
}
System.out.println("Unique number: " + result); // 输出 3
}
}
6. 总结
- 异或是一种按位操作,不同为 1,相同为 0。
- 具有许多重要特性,如交换律、自反性等。
- 常见用途包括加密解密、变量交换、查找唯一元素和计算汉明距离。