不用第三个变量交换两个变量的值(四种方法汇总,含异或法)

本文介绍了一种不使用临时变量进行变量交换的方法——异或法,通过位运算^实现两个整型变量的值交换,避免了传统方法可能带来的溢出风险和精度损失。同时对比了加减法、乘除法等常见变量交换方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法如下

  1. 加减法
  2. 乘除法
  3. 异或法

学习过程中,我们交换两个数字总要用到第三方变量暂存其中一个变量的值。
做法通常如下:

//第三变量法
	int a = 2, b = 3;
	int c;
		c=a;
		a=b;
		b=c;

这种方法有溢出的风险,此外还有两种方法——加减法和乘除法。

//加减法
int a=3;
int b=5;
	a=a+b;
	b=a-b;//b=3
	a=a-b;//a=5
//乘除法:可以处理整型和浮点型变量,但存在精度损失问题以及b不能为0的限制
int a=3;
int b=5;
	a=a*b;
	b=a/b;
	a=a/b;

今天看到一个不用c的方法——异或法,在这里做一个小小的笔记。

//异或法 例1:
//适用于整形变量,不适用于浮点型变量
     int a=2;	//10
     int b=3;	//11
        a=a^b;		//01=10^11
        b=a^b;		//10=01^11
        a=a^b;		//11=01^10 

这里用到了位运算 ^异或 的知识。
异或(XOR)的运算规则是:相同为0, 不同为1(相当于减法)。
可以总结为:数a与数b做异或运算之后成为了数c,数c和数b异或一次可以变回原来的数据a。
公式表示如下:a ^ b ^ b=a; a ^ b ^ a=b

//异或法 例2:
int a=4;//a:0100
int b=5;//b:0101
	a=a^b;//0100 ^ 0101=0001,此时a:0001,b 不变   (b:0101)
	b=a^b;//0001 ^ 0101=0100,此时a:0001,b:0100(即b的值为4)
	a=a^b;//0001 ^ 0100=0101,此时a:0101,b:0100,
		  //转换二进制为十进制得到a=5,b=4;

数组里也同样适用——

int a[n];
int i;	// i < n
	a[i]=a[i]^a[0];
	a[0]=a[i]^a[0];
	a[i]=a[i]^a[0];

异或运算不会产生进位,所以不会造成数据损失,但是这种交换方式阅读性差,可以作为某些题目的非常规解法,用来开拓思路。
实际在大部分编译器上,用第三变量法生成的代码速度好过这种方式。所以还是定义第三方变量比较常用和好用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值