在论坛的帖子里看到一个面试题,交换两个整数。以往知道的方法有两种,一是使用临时变量temp,二是两个整数相加减的算法。在帖子里发现了第三种算法,异或运算:
a=a^b;
b=b^a;
a=b^a;
一时好奇,研究了一下,得出本文。
异位运算交换两个整数的算法原理。
交换两个整数常规的实现就是使用临时变量,异位运算交换两个整数不需要临时变量,其实是把临时变量与其中的一个整数结合起来了,也就是说把其中的一个整数当做临时变量来用,这一点与两数相加减的算法是一到致的。下面讲讲原理。
异或运算有两个特性:
1、一个数异或本身恒等于0,如5^5恒等于0;
2、一个数异或0恒等于本身,如5^0恒等于5。
交换两个整数a和b,无非是a=b和b=a这两个操作,当然,你不能直接这么做。该怎么变呢?
算式一:a=b^(a^a)=a^(a^b);
算式二:b=a^(b^b)^(a^a)=a^(a^b)^(a^b);
注意上面算式二中的a还是原来的a,不要认为是改变后的a。
为什么右边的式子都留个a,没为什么,我就是想把b做为临时变量来用,此处要注意,既然做为临时变量用那么b就是最后才计算出来的数。接下来认真的分析下上面的两个算式。得出以下java语句:
把a^b做为临时变量值赋给b(临时变量),得
b=a^b;
计算出a:
a=a^b;注意这时的b可就是上面的式子已改变过的b了。
计算出b:
b=a^b;注意仔细观察上面的式二。
至此完成了两个整数的交换。
Test4.java
public class Test4 {
/**
* @param args
*/
public static void main(String[] args) {
new Test4().swap(5, 3);
}
/**
* 异位运算交换两个整数
* @param a
* @param b
*/
public void swap(int a ,int b){
System.out.println(" a = " + a );
System.out.println(" b = " + b );
// 写法一:以a作为临时变量
// a=a^b;
// b=b^a;
// a=b^a;
// 写法二:以b作为临时变量
b=a^b;
a=a^b;
b=a^b;
System.out.println(" a = " + a );
System.out.println(" b = " + b );
}
}
分享到:
相关推荐
下面是一个简单的Java代码实例,展示了如何使用异或操作符来交换两个整数变量`A`和`B`: ```java import java.util.Scanner; public class VariableExchange { public static void main(String args[]) { ...
在编程实现时,我们可以用两个数组分别表示两个大整数,然后从低位开始遍历,对每个位置进行相加,并考虑进位。 **减法运算** 大整数的减法与加法类似,也是从低位开始逐位相减,但需要注意借位的问题。如果被减数...
此外,对于二进制操作熟练的开发者,还可以使用异或操作(XOR)来交换两个整数,这也是一个高效且节省空间的方法: ```e .变量A = 10 .变量B = 20 .变量A = .变量A XOR .变量B // 对两个数进行异或操作 .变量B = ....
这个特性使得异或运算在加密领域有广泛的应用。 下面我们将详细介绍如何在Winform应用中使用异或算法: 1. **加密过程**: - 首先,选择一个密钥(key),它是一个整数或者字节数组,用于进行异或操作。密钥应该...
根据给定的信息,“精彩编程与编程技巧-快速交换整数...”,我们可以推断出这篇文章主要讨论的是关于在编程中如何不使用临时变量来快速交换两个整数的值的方法。接下来,我们将详细介绍这一技术及其背后的原理。 ##...
**异或交换法**是一种非常有趣的不使用额外变量来交换两个整数的方法。它基于XOR运算的特点,即任何数与自身进行XOR操作结果为0,任何数与0进行XOR操作结果为该数本身。具体步骤如下: 1. **初始化**: - 假设有两...
6. **高低位交换**:对于32位无符号整数,可以通过位操作实现高低16位的交换,例如通过异或和与运算。 掌握这些位运算技巧,不仅可以提高编程效率,还能帮助理解计算机底层的工作原理。在编写高效的算法或解决特定...
例如,通过异或运算来交换两个变量的值: ```c int a = 5, b = 10; a = a ^ b; b = a ^ b; a = a ^ b; ``` 这种方式同样不需要额外的存储空间,而且能够避免溢出的问题。 ### 四、总结 经典的无辅助变量数据交换...
- 示例3则通过异或运算实现了对低4位取反的效果,并展示了如何交换两个整数的值。 位运算的掌握有助于编写更高效、更底层的代码,尤其是在处理硬件接口、内存管理或数据编码解码等场景。学习位运算需要理解二进制...
异或运算是无冲突的交换两个数的值的有效方法,无需额外的临时变量。 “取反”运算符(~)是一个一元运算符,它会将一个数的每一位取反,即将0变为1,将1变为0。例如,取反3(二进制11)得到-4(二进制11111110,...
例如,两个数进行and运算时,只有当对应位都是1时,结果位才为1。这种运算常用于提取二进制位,如判断一个数是否为偶数(通过检查最低位是否为0)。例如,6(110) and 11(1011) = 2(0010),其中6的二进制最末位是0,...
位运算的逆运算特性可以应用于各种算法设计,如在不使用额外变量的情况下交换两个数的值,如前面提到的使用异或操作交换变量a和b的值。这种技巧在内存受限或效率要求高的场景下特别有用。 总之,位运算在C++编程中...
3. **交换变量值**:通过异或操作,可以在不引入额外变量的情况下交换两个数的值: ```javascript a = a ^ b; b = a ^ b; a = a ^ b; ``` 4. **奇偶性检查**:任何数与1进行异或运算,如果结果为0,则原数是...
按位异或运算常用于数据校验、密码学中的简单加密解密过程,以及实现无临时变量的交换两个变量值等场景。 #### 按位取反运算 (~) 按位取反运算符`~`用于对一个数的二进制表示进行取反,即将所有位的0变为1,1变为0...
这常用于交换两个变量的值而不需要第三个临时变量。 5. **左移(LEFT SHIFT)操作**:将一个数的二进制位向左移动指定的位数。例如,0b101 ,相当于乘以2的指定幂次。在C语言中,用`表示左移。 6. **右移(RIGHT ...
位运算在C语言中可以用来实现高效的算法,如快速设置或清除位,交换两个变量的值(如例子中提到的a和b的交换,无需额外的临时变量),以及进行位级别的逻辑判断。它们在内存管理、数据编码、网络协议解析等领域都有...
2. **交换变量**:无需中间变量,可以使用异或交换两个变量的值。例如,a = a ^ b, b = a ^ b, a = a ^ b,这样a和b的值就会互换。 3. **查找数组中的唯一元素**:在一个已知所有元素两两异或结果为0的数组中,通过...
它可以用来取反特定位,或者不引入第三个变量的情况下交换两个变量的值。 4. **求反运算**:求反运算符"~"是单目运算符,它会将操作数的每一位取反,0变为1,1变为0。 5. **左移运算**:左移运算符"将操作数的...
位运算的一个经典应用是在不使用额外变量的情况下交换两个整数。这里有两个常见的方法: - 方案1:使用算术运算,即`a = a + b; b = a - b; a = a - b;`。这种方法虽然简洁,但在数值过大可能导致溢出的情况下可能不...