基于异或(^)运算进行数值交换的可行性分析

原创 2006年05月29日 22:52:00

基于异或运算可以不用牺牲空间就完成两个变量数值交换的操作。而在编程实践中一般都会用到第三空间来保存变量,使变量在交换过程中不至于数值改变,在此统称之为信息丢失。

为什么异或运算可以不借用第三空间但不造成信息丢失呢?

这里涉及到异或运算的一个良好性质,在表述这个性质之前我们先看一个几何上的例子。

设现有二维空间中两向量A,B。为表示方便令A为X轴正方向上的向量,B为Y轴正方向上的向量。现在我们可以利用A,B两向量的向量运算很容易就得到第三个向量C,即C = A + B;这里的向量C显然是位于第一象限中的向量。至此存在三个向量,ABC,而如果ABC中任一向量信息的丢失,则可以通过另两向量进行还原。现在你应该这个例子中所透露出来的性质。

这里的异或运算同样也是跟上述例子一样。

即C=A^B;

A=C^B;

B=C^A;

正是异或运算这一良好的性质也成为了密码学的密码编码中一个最基本的运算。

现有明文P,密钥K,我们可以通过P,K经过一系列的运算过程(置换,变换,移位,异或运算)生成密文C。

对于置换,变换,移位这种类型的运算可以通过它们的逆运算进行还原,而异或运算亦可以通过上述性质进行还原,这就使得通过密钥K,密文C生成明文P成为可能。

即:C=P^K;

=》P=C^K;

注:在此提到的异或运算在密码学中的应用只是为了说明一下异或运算性质的应用环境,而真正的密码学中编码过程远比上述要复杂。

数组中用异或进行数值交换需要注意的问题

用异或交换数组中两个数的值可能出现数值变成0的情况

两个很长的16进制字符串怎么进行异或运算

str1="0d1fe39e573488cf" str2="0d1fe39e573488ee595acd5c6d4ce0f445476794" 怎不进行异或运算? 由于太长不能转化成...

采用异或运算进行加密和解密

1.异或运行原理 同位相同得0,相反得1 如3^8  0011 1000 ---- 1011 即1011 为十进制 11 当3^8^8时 即 1011 1000 ------- 0011(十进制3) ...

JAVA高精度数值运算方法,小数点后保留位数,结合相关例题进行介绍!

int数据类型的位数为16位,short int数据类型的位数为16位,而long int的位数为32位。其余常用数据类型的位数也相当有限。在实际应用中,需要对更大或者更小的数进行运算和处理。Java...

异或运算实现两个数的交换

通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 采用下面的方...

在不借助第三方变量情况下实现两个变量的交换(借助于异或运算)

下面首先来看一个问题。 假设存在两个int型变量a和b,那么如何实现两个变量值的交换呢。 通常我们的做法,也是最容易想到的做法就是通过定义一个第三方变量,然后借助于该变量来实现变量值的交换。 方...

Java中异或运算实现两个整数的交换以及其功能函数实现

今天学习到一种超酷炫的交换两个整数的方法,给各位分享一下。异或运算属于位运算的一种,首先简单介绍一下异或预算的语法规则。 假设a与b为不相等的两个整数。 (1)a^a=0; (2)a^b=0; (3)...

java异或运算交换两个数的陷阱

我们知道,用异或运算可以不用定义中间变量就可以交换两个数。如下: int a=2; int b=3; System.out.println("交换前:a="+a+" b="+b); a...
  • Mr__mao
  • Mr__mao
  • 2015年08月12日 20:43
  • 408

异或运算实现两个数的交换

通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 采用下面的方...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于异或(^)运算进行数值交换的可行性分析
举报原因:
原因补充:

(最多只允许输入30个字)