程序设计中利用“按位异或”运算交换两个变量的值原理
2015-03-27 15:15
309 查看
按位异或运算是指两个相应的二进制相同时结果为0,否则为1。
若欲交换两个变量的值,而又不借助其他的中间变量,那么在C++中可以用下面的语句:
a = a ^ b; //语句1
b = a ^ b; //语句2
a = b ^ a; //语句3
主要的原理是:
(1)一个变量按位异或自己的结果为0,即:a ^ a = 0;
(2)一个变量按位异或0的结果为自己,即:a ^ 0 = a;
于是,在上面的三条语句中,语句1可以看做把变量a、b保存到a的存储空间中(当然这只是一种理解方式);语句2消去了b(原理1),于是剩下了a(原理2),赋值到b的存储空间,此刻,b变量已经得到了a的值;语句3中,原本a变量存储空间内已经同时保存了a、b,此刻,b已经变成了a,所以两个按位异或后,便消去了a(原理1),只剩下了b(原理2),将它赋值给a,至此,交换变量的过程结束。
以前学习是总是没有弄明白为什么,直到在《Visual.C.开发实战1200例.第1卷》书中看到了第二章的实例38后,才搞明白了,附图如下:
若欲交换两个变量的值,而又不借助其他的中间变量,那么在C++中可以用下面的语句:
a = a ^ b; //语句1
b = a ^ b; //语句2
a = b ^ a; //语句3
主要的原理是:
(1)一个变量按位异或自己的结果为0,即:a ^ a = 0;
(2)一个变量按位异或0的结果为自己,即:a ^ 0 = a;
于是,在上面的三条语句中,语句1可以看做把变量a、b保存到a的存储空间中(当然这只是一种理解方式);语句2消去了b(原理1),于是剩下了a(原理2),赋值到b的存储空间,此刻,b变量已经得到了a的值;语句3中,原本a变量存储空间内已经同时保存了a、b,此刻,b已经变成了a,所以两个按位异或后,便消去了a(原理1),只剩下了b(原理2),将它赋值给a,至此,交换变量的过程结束。
以前学习是总是没有弄明白为什么,直到在《Visual.C.开发实战1200例.第1卷》书中看到了第二章的实例38后,才搞明白了,附图如下:
相关文章推荐
- 程序设计中利用“按位异或”运算交换两个变量的值原理
- C/java语言 利用异或运算来交换两个变量的值
- 交换两个数,不用第三方变量(异或运算)
- 为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
- 在不借助第三方变量情况下实现两个变量的交换(借助于异或运算)
- java中把两个变量进行值交换,通过异或两次运算就能实现值互换。
- 如何不利用一个额外的变量来达到交换两个变量值的目的-------位上的异或运算
- 如何不利用一个额外的变量来达到交换两个变量值的目的-------位上的异或运算
- 如何不利用一个额外的变量来达到交换两个变量值的目的-------位上的异或运算
- 利用异或运算实现两个变量的互换(学习)
- 深入理解异或运算 xor 的含义——再探不使用加减乘除实现加法运算、不使用额外空间交换两个变量的值
- (1.1.2)C的|、||、&、&&、异或、~、!运算 (交换两个值,不用临时变量)
- 按位异或运算交换两个变量的值原理
- 为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
- 使用异或运算对交换两个变量的数据
- 通过异或运算实现两个变量的交换(不需借助第三个变量)
- 异或运算交换两个变量的值
- 利用异或运算实现交换2个数据
- C、C++、Java异或运算交换变量变量值的区别
- 用异或来交换两个变量能提快速度是错误的