`
haliluya4
  • 浏览: 123459 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

强大的数学原理,异或用于字符交换

 
阅读更多

今天看到一篇有关字符串逆序的各种实现算法的文章,里面有一种不使用临时变量的字符交换算法把我震惊了。

 

上网搜了下,发现百度百科里就有这么一段:

xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。

 

x <- x # y
y <- x @ y
x <- x @ y
执行了第一句后x变成了x # y。那么第二句实质就是y <- x # y @ y,由于#和@互为逆运算,那么此时的y变成了原来的x。第三句中x实际上被赋值为(x # y) @ x,如果#运算具有交换律,那么赋值后x就变成最初的y了。这三句话的结果是,x和y的位置互换了。
加法和减法互为逆运算,并且加法满足交换律。把#换成+,把@换成-,我们可以写出一个不需要临时变量的swap过程(Pascal)。
procedure swap(var a,b:longint);
begin
a:=a + b;
b:=a - b;
a:=a - b;
end;
好了,刚才不是说xor的逆运算是它本身吗?于是我们就有了一个看起来非常诡异的swap过程:
procedure swap(var a,b:longint);
begin
a:=a xor b;
b:=a xor b;
a:=a xor b;
end;
注意:位运算版本的交换两数不适用于一个数的自我交换。也就是说,如果上述程序的“b”改成“a”的话,其结果是变量a变成零。因此,在使用快速排序时,由于涉及到一个数的自我交换,因此如果要在其中使用位运算版的交换两数的话,应该先判断。
分享到:
评论

相关推荐

    对于字符串进行DES加密的控件

    它基于64位的数据块和56位的密钥进行操作,通过一系列复杂的数学运算(如置换、异或等)将明文转化为密文。DES虽然历史悠久,但由于其密钥长度较短,现代计算能力下已不被认为足够安全。不过,它仍然是理解和学习...

    8086汇编指令大集合

    4. **串操作指令**:如`MOVSB`、`MOVSW`、`CMPSB`等,用于处理连续的数据块,常用于数组或字符串的处理。 5. **控制转移指令**:包括条件跳转指令(如`JZ`、`JC`)、无条件跳转指令(如`JMP`)和子程序调用/返回...

    对字串加解密的源码(原刨)

    加密算法可能会对这些ASCII值进行特定的数学运算,如异或操作。 2. **密钥管理**:密钥是加密和解密的关键,如果每次加密都使用新的密钥,那么多次加密同一字符串会得到不同的结果。VBS可以通过内置的`Rnd`函数生成...

    用c写的简单加解密程序

    加解密算法通常基于数学或计算原理,通过一系列变换将明文(可读数据)转换为密文(看似随机的数据),然后再将密文还原为明文。在这个C语言实现的简单加解密程序中,主要涉及以下知识点: 1. **ASCII码**:ASCII码...

    计算机组成原理-白中英课后习题答案.rar

    - **字符编码**:ASCII码、Unicode(UTF-8)等,用于表示各种字符。 4. **运算器** - **算术运算**:加减乘除、移位等,用于执行数学运算。 - **逻辑运算**:与、或、非、异或,用于进行布尔逻辑操作。 5. **...

    常用C语言用法速查手册(PDG格式)(中文版).rar

    C标准库提供了大量的函数,涵盖了数学计算、输入/输出、字符串处理、内存管理等多个方面。熟练使用这些函数可以提高代码的可读性和效率,例如sqrt用于计算平方根,strlen用于计算字符串长度。 九、位操作 C语言提供...

    0426、100个经典C语言程序资料.zip

    10. **标准库函数**:C语言的标准库提供了大量功能强大的函数,如数学运算、字符串处理、时间管理等,是编写C程序的重要工具。 11. **程序设计模式**:了解如何组织和设计C程序,如函数的封装、模块化编程、递归等...

    易语言字节集文本简单加密.7z

    异或操作具有自反性和交换性,可以保证解密时的正确性。 4. **处理边界问题**:如果原文长度不是密钥长度的整数倍,可以使用循环或填充策略来确保所有字节都参与加密。 5. **结果存储**:将加密后的字节集保存,...

    2015年苏州移动研发中心笔试题

    - **数字题**:这一类题目可能涉及到数列、数学运算规则等,用于考察基本的数学能力和逻辑思维。 ### 专业测试 #### 排序算法稳定性 - **稳定排序算法**:如果一个排序算法能够保证相等元素的相对位置在排序前后...

    密码学加密与解密算法演示程序含源码(Cryptology)

    它基于大整数因子分解的困难性,拥有公钥和私钥两部分,公钥用于加密,私钥用于解密,适合于数据签名和密钥交换。 8. **DF(Diffie-Hellman)密钥交换**:由Diffie和Hellman提出的密钥交换协议,允许双方在不安全的...

    汇编语言指令大全

    6. **字符串处理指令**:如CMPSB(比较字节)、LODSB(加载字节)等,用于处理字符串数据。 7. **输入/输出指令**:如IN(输入)、OUT(输出),用于与外部设备通信。 ### 学习汇编语言的重要性 尽管高级语言因其...

    活字格-MD5加密.zip

    1. **MD5的原理**:MD5由美国计算机科学家罗纳德·李维斯特(Ronald Rivest)于1991年提出,它接收任意长度的输入(也称为“明文”),然后通过一系列复杂的数学运算(包括位操作、异或、加法等)生成固定长度的输出...

    易语言RC4加密解密

    密钥流生成阶段,通过一系列交换操作不断更新S盒,每次取出一对值生成密钥流,与明文进行异或操作完成加密。 3. 易语言RC4解密原理: 解密过程与加密过程基本一致,因为异或的逆操作还是异或。接收方拿到密文和...

    ACM模板byXYM

    `Cin.push_back(ch)`是一个特殊的方法,用于将刚刚读取的字符放回输入流中,以便下一次读取时再次获取该字符。这对于处理复杂的输入格式非常有用。 #### 3. 处理特殊输入格式 当遇到类似`D1000`这样的输入时,可以...

    Linux-C-编程一站式学习

    - **异或运算的一些特性**:异或运算的独特性质,如自反性、交换律等。 - **其它运算符**: - **复合赋值运算符**:如+=、-=等,用于在赋值的同时执行算术运算。 - **条件运算符**:三元运算符,用于基于条件选择...

    qingcheng.rar_qingcheng

    10. **A1405 交换.c**:简单的数据交换问题,通常采用临时变量或者异或操作实现。是C语言基础操作,有助于理解数据类型的特性。 这些题目覆盖了基础的数据结构、算法、数值处理等多个方面,对于提升编程思维和解决...

    C语言经典案例10例,编译就能运行

    3. **创建文件写入字符**:C语言提供标准库函数如`fopen`, `fwrite`, `fclose`等用于文件操作。案例将展示如何打开一个新文件,向其中写入字符数据,并安全关闭文件。 4. **动态内存分配**:C语言中的`malloc`, `...

    对称加密实例

    在本文中,我们将深入探讨对称加密的基本原理、常见算法以及如何在实际应用中实现字符串和文件的加密。 对称加密的历史可以追溯到古代,人们使用简单的替换和排列规则来隐藏信息。现代对称加密技术则基于更复杂的...

    JAVA语言程序设计第六版编程答案第三章

    - **算术运算**:加法运算作为最基本的数学操作之一,在编程中极其常见,可用于构建更复杂的数学模型或游戏逻辑。 综上所述,JAVA语言程序设计第六版第三章的编程练习涵盖了基本的输入输出、数据类型转换、逻辑判断...

Global site tag (gtag.js) - Google Analytics