今天看到一篇有关字符串逆序的各种实现算法的文章,里面有一种不使用临时变量的字符交换算法把我震惊了。
上网搜了下,发现百度百科里就有这么一段:
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变成零。因此,在使用快速排序时,由于涉及到一个数的自我交换,因此如果要在其中使用位运算版的交换两数的话,应该先判断。
相关推荐
它基于64位的数据块和56位的密钥进行操作,通过一系列复杂的数学运算(如置换、异或等)将明文转化为密文。DES虽然历史悠久,但由于其密钥长度较短,现代计算能力下已不被认为足够安全。不过,它仍然是理解和学习...
4. **串操作指令**:如`MOVSB`、`MOVSW`、`CMPSB`等,用于处理连续的数据块,常用于数组或字符串的处理。 5. **控制转移指令**:包括条件跳转指令(如`JZ`、`JC`)、无条件跳转指令(如`JMP`)和子程序调用/返回...
加密算法可能会对这些ASCII值进行特定的数学运算,如异或操作。 2. **密钥管理**:密钥是加密和解密的关键,如果每次加密都使用新的密钥,那么多次加密同一字符串会得到不同的结果。VBS可以通过内置的`Rnd`函数生成...
加解密算法通常基于数学或计算原理,通过一系列变换将明文(可读数据)转换为密文(看似随机的数据),然后再将密文还原为明文。在这个C语言实现的简单加解密程序中,主要涉及以下知识点: 1. **ASCII码**:ASCII码...
- **字符编码**:ASCII码、Unicode(UTF-8)等,用于表示各种字符。 4. **运算器** - **算术运算**:加减乘除、移位等,用于执行数学运算。 - **逻辑运算**:与、或、非、异或,用于进行布尔逻辑操作。 5. **...
C标准库提供了大量的函数,涵盖了数学计算、输入/输出、字符串处理、内存管理等多个方面。熟练使用这些函数可以提高代码的可读性和效率,例如sqrt用于计算平方根,strlen用于计算字符串长度。 九、位操作 C语言提供...
10. **标准库函数**:C语言的标准库提供了大量功能强大的函数,如数学运算、字符串处理、时间管理等,是编写C程序的重要工具。 11. **程序设计模式**:了解如何组织和设计C程序,如函数的封装、模块化编程、递归等...
异或操作具有自反性和交换性,可以保证解密时的正确性。 4. **处理边界问题**:如果原文长度不是密钥长度的整数倍,可以使用循环或填充策略来确保所有字节都参与加密。 5. **结果存储**:将加密后的字节集保存,...
- **数字题**:这一类题目可能涉及到数列、数学运算规则等,用于考察基本的数学能力和逻辑思维。 ### 专业测试 #### 排序算法稳定性 - **稳定排序算法**:如果一个排序算法能够保证相等元素的相对位置在排序前后...
它基于大整数因子分解的困难性,拥有公钥和私钥两部分,公钥用于加密,私钥用于解密,适合于数据签名和密钥交换。 8. **DF(Diffie-Hellman)密钥交换**:由Diffie和Hellman提出的密钥交换协议,允许双方在不安全的...
6. **字符串处理指令**:如CMPSB(比较字节)、LODSB(加载字节)等,用于处理字符串数据。 7. **输入/输出指令**:如IN(输入)、OUT(输出),用于与外部设备通信。 ### 学习汇编语言的重要性 尽管高级语言因其...
1. **MD5的原理**:MD5由美国计算机科学家罗纳德·李维斯特(Ronald Rivest)于1991年提出,它接收任意长度的输入(也称为“明文”),然后通过一系列复杂的数学运算(包括位操作、异或、加法等)生成固定长度的输出...
密钥流生成阶段,通过一系列交换操作不断更新S盒,每次取出一对值生成密钥流,与明文进行异或操作完成加密。 3. 易语言RC4解密原理: 解密过程与加密过程基本一致,因为异或的逆操作还是异或。接收方拿到密文和...
`Cin.push_back(ch)`是一个特殊的方法,用于将刚刚读取的字符放回输入流中,以便下一次读取时再次获取该字符。这对于处理复杂的输入格式非常有用。 #### 3. 处理特殊输入格式 当遇到类似`D1000`这样的输入时,可以...
- **异或运算的一些特性**:异或运算的独特性质,如自反性、交换律等。 - **其它运算符**: - **复合赋值运算符**:如+=、-=等,用于在赋值的同时执行算术运算。 - **条件运算符**:三元运算符,用于基于条件选择...
10. **A1405 交换.c**:简单的数据交换问题,通常采用临时变量或者异或操作实现。是C语言基础操作,有助于理解数据类型的特性。 这些题目覆盖了基础的数据结构、算法、数值处理等多个方面,对于提升编程思维和解决...
3. **创建文件写入字符**:C语言提供标准库函数如`fopen`, `fwrite`, `fclose`等用于文件操作。案例将展示如何打开一个新文件,向其中写入字符数据,并安全关闭文件。 4. **动态内存分配**:C语言中的`malloc`, `...
在本文中,我们将深入探讨对称加密的基本原理、常见算法以及如何在实际应用中实现字符串和文件的加密。 对称加密的历史可以追溯到古代,人们使用简单的替换和排列规则来隐藏信息。现代对称加密技术则基于更复杂的...
- **算术运算**:加法运算作为最基本的数学操作之一,在编程中极其常见,可用于构建更复杂的数学模型或游戏逻辑。 综上所述,JAVA语言程序设计第六版第三章的编程练习涵盖了基本的输入输出、数据类型转换、逻辑判断...