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

转载 2015年04月16日 08:27:47

通常的交换两个变量a,b的过程为

int temp;

temp=a

a=b;

b=temp;

需借助上面的第3个临时变量temp.


采用下面的方法,对于给定两个整数a,b,下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量:

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质:

1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0

2.任意一个变量X与0进行异或运算,结果不变,即X^0=X

3.异或运算具有可结合性,即a^b^c=(a^b)^c=a^(b^c)

4.异或运算具有可交换性,即a^b=b^a


分析:

第一步:    a = a ^ b;

完成后 a变量的结果为a ^ b


第二步:    b = a ^ b;

此时赋值号右边的a保存的是a ^ b的值,那么将赋值号右边的a用a ^ b替换,

得到(a ^ b) ^ b=a ^ (b ^ b)=a ^0=a,

即经过第二步运算后b中的值为a,即b=a,将a换到了b里


第三步:    a = a ^ b;

此时赋值号右边的a保存的仍然是a ^ b的值,不变,而赋值号右边的b已经是a 了,

将赋值号右边的a,b分别进行替换,

即此时赋值号右边a ^ b=(a ^ b)^ a=a ^ b^ a=a ^ a^ b=0^ b=b, 该值赋值给a,即a=b

即经过第三步运算后a中的值为b,即a=b,将b换到了a里

这样经过如上的三步骤,完成了交换两个变量a,b而无需借助第3个临时变量过程。

这个过程等价于如下的过程,:

a=a+b

b=a-b;

a=a-b;

前提是a+b的值不能溢出。

测试程序如下:

int main()
{
    int a = 4, b = 5;
    printf("a=%d b=%d\n", a, b);
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a=%d b=%d\n", a, b);
}

运行结果:
[root@test cs]# ./a.out
a=4 b=5
a=5 b=4
[ 注意:当a和b相等时,该方法不适用]

--本文结束--

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

通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 采用下面的方...
  • heathyhuhu
  • heathyhuhu
  • 2013年10月15日 08:32
  • 13334

算法实现两个数交换(多种方法)

算法实现两个数交换(多种方法)
  • u012965373
  • u012965373
  • 2016年01月16日 21:10
  • 2256

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

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

异或运算交换两个数

a = a^b; b = a^b; a = a^b; 这样就可以不借助第三个变量实现两个数的交换。基于如下几个性质: 任意变量x与自身异或结果为0,即:x^x = 0 任意变量x与0进行异或运算,结果...
  • u011240016
  • u011240016
  • 2017年03月07日 22:54
  • 201

交换两个数的四种方法

交换两个数的四种方法
  • sayhello_world
  • sayhello_world
  • 2016年07月06日 09:41
  • 3668

C语言实现交换两个数

C语言中要实现交换两个变量的值可以有很多种方法,下面是我收集的方法:方法一:使用临时变量void exchange(int *a, int *b){ int temp = 0; temp ...
  • flyingstarwb
  • flyingstarwb
  • 2009年06月24日 22:18
  • 14243

如何实现两个数交换的交换以及宏定义的编写

【语句实现方法】 方法1:不使用中间变量 ●利用位运算符  a = a^b; b = a^b; a = a^b;  →    a^= b^ = a^ = b;(不用考虑越界问题) 【解释】: ...
  • u012512762
  • u012512762
  • 2014年10月16日 12:18
  • 2025

用函数和指针实现两个数的交换

#include void swap(int* p1,int* p2) {  int t;  t=*p1;  *p1=*p2;  *p2=t; } int main(...
  • liu_111111
  • liu_111111
  • 2011年11月02日 11:41
  • 793

【C语言学】写一个俩个数交换的宏定义

第一种: //直接法 #define SWAP(a, b) { a = a ^ b, b = a ^ b, a = a ^ b } 可如果是浮点运算怎么办? 第二种: //加入类型声...
  • KISS_BEN
  • KISS_BEN
  • 2012年11月04日 23:14
  • 4255

[c]不用第三个数,去交换二个数的位置。

int a = 10; int b = 20; 第一种方法: a = a + b; b = a - b; a = a - b; 第二种方法: a = a ^ b; b = a ^ b; a =...
  • s133315202
  • s133315202
  • 2015年08月13日 15:06
  • 840
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:异或运算实现两个数的交换
举报原因:
原因补充:

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