65.9K
CodeProject 正在变化。 阅读更多。
Home

神奇的异或(XOR)

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.56/5 (10投票s)

2011年8月17日

CPOL

4分钟阅读

viewsIcon

32934

downloadIcon

204

异或运算很神奇,它能为你做什么?它可以交换变量的值,备份和加密数据。

引言

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, file2file3),我们需要一个备份,一旦这 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 日:初始版本
© . All rights reserved.