神奇的异或(XOR)
异或运算很神奇,它能为你做什么?它可以交换变量的值,备份和加密数据。
引言
XOR 是二进制数 0 或 1 之间的逻辑运算,有时它可以帮助我们以简单的方式解决问题。在本文中,我将向你展示 XOR 可以做什么,以及如何实现它。
XOR 的背景
什么是 XOR?当你对两个数字进行 XOR 运算时,结果的规则是
0 XOR 1,结果是 1,1 XOR 0,结果是 1;0 XOR 0,结果是 0,1 XOR 1,结果是 0。你可以用 False 和 True 代替 0 和 1。这意味着当操作数相同时,结果是 0(或 False),否则是 1(或 True)。换句话说,XOR 可以告诉你操作数之间是否存在差异。凭借它的功能,我们可以用它来做什么?
XOR 中的 3 个功能
1. 交换两个变量的值
提问
假设有两个变量,如下所示:A = 3,B = 5。现在,你需要交换它们的值,交换后,它们看起来像这样:A = 5,B = 3。
答案
有 3 种方法可以交换它们
方法 1. 定义一个新变量 C,将 A 的值保存到 C,并将 B 的值保存到 A,最后,将 C 的值保存到 B,请看下面的伪代码
int C = A; // define a new variable C, it saved the value of A
A = B; // Save the value of B to A
B = C; // Save the value of C(come from A in first line) to B
然后,A 和 B 的值被交换了。
方法 2. 另一种方法是使用数学方法,原理是让一个变量(假设 A)保存它们之间的差异,另一个变量 (B) 加上这个差异,那么它将变成 A,并且变量 B 的结果减去这个差异就是 A,伪代码是
A = A – B; // let a save the discrepancy of A & B
B = A + B; // the discrepancy(new save in A) add B, save in B; now B is the
// value of A what before changed
A = B – A; // B subtract the discrepancy save in A, now A is the value of B
// what before changed
你可以按照上面的代码验证此方法;A 和 B 的值被交换了。
方法 3. 通过 XOR 运算交换它们。这种方式与方式 2 相似。见下文
A = A ^ B; // Save the XOR operation result of A & B to variable A
B = A ^ B; // Save the XOR operation result of A (result of A & B at last step) &
// B to variable B
A = A ^ B; // Save the XOR operation result of A (result of A & B at first step) &
// B (result of A & B at last step)
(符号 ^ 是 C# 中的 XOR 运算,你可以将其更改为你正在编写的语言中的正确符号)。
你可以看到这些代码非常酷,每行右侧的操作和操作数都相同,经过 3 次操作后,值被交换了。
2. 备份信息
XOR 运算如何备份数据? 如我们所知,对于备份数据,我们可以在数据被修改之前保存一份数据的副本,然后在需要时在修改后恢复它。 但是,如果需要备份大量数据,则为每个数据保存一份副本对于空间(内存或磁盘空间)来说代价太高了。 使用 XOR 运算,我们只能使用一个数据来恢复所有数据。 首先,我们必须了解 XOR 的另一个特性,请看下面。
假设有 3 个变量 A、B 和 C,我们得到第四个变量 X,然后让 X 为 A^B^C。这意味着,变量 X 是 A XOR B 和 XOR C 的结果。现在你可以尝试一下,这 4 个变量具有以下关系
X = A^B^C; // Save the result of A, B & C to variable X
那么
A = B^C^X; // the value of A is the XOR operation result of B, C & X
B = A^C^X; // the same as above, instead of B
C = B^C^X; // the same as above, instead of C
换句话说,如果变量 X 是 A、B 和 C 的结果,那么这 4 个变量中的一个是其他 3 个变量的 XOR 结果。
然后我们得到这样一个有趣的特性,它如何备份数据?
如上面的伪代码假设磁盘中保存了 3 个文件 (file1, file2 和 file3),我们需要一个备份,一旦这 3 个文件中的一个崩溃,就可以恢复它。 因此,我们创建另一个文件 (FileX),当 file1 崩溃时,我们可以通过以下操作重建它:file1 = file1 ^ file2 ^ FileX
。 你可以看到示例代码的实现。 你可以看到每个文件都以二进制数组的形式读取,并进行 XOR 运算。 这种备份数据的方法的优点是只占用少量大小的数据,并且可以备份大量数据,但缺点是它需要大量的操作。
3. XOR 的第三个功能是加密
在某些情况下,一个非常简单的加密可以使用 XOR。 当需要加密消息时,让它与一个固定的消息进行 XOR 运算,结果就是密文,而我们需要获取原始消息时,密文与固定消息进行 XOR 运算,结果就是原始消息。 你可以自己尝试一下。
代码描述
附加的代码向你展示了 XOR 运算如何仅使用一个文件备份 3 个文件。 在 Debug 文件夹中有 3 个文本文件,当你点击 <Back up> 按钮时,将创建一个新的文本文件 FileX.txt,它包含现有 3 个文件的 XOR 结果,它是上述 3 个文本文件的备份数据。 然后,你删除 <file2.txt>,然后点击 <Recover>,file2.txt 就回来了! 试试看,如果您有任何问题,请通过 kentbill@gmail.com 与我联系。
历史
- 2011 年 8 月 17 日:初始版本