位操作之交换两个数

交换两个数

直接上菜

平常的方法我们可以这样:

void Swap(int &a, int &b)
{
	int temp=0;
	temp=a;
	a=b;
	b=temp;
}

&为引用,相当于一个变量的别名,可以直接对变量操作。

void Swap(int &a, int &b)
{
	if (a != b)
	{
		a ^= b;
		b ^= a;
		a ^= b;
	}
}

首先判断,两个相同的数^(异或)结果为0,开头加一个判断可以避免这种情况,并且相同的数交换是没有意义的。a = ^ b,结果为一个不确定的数;b ^ = a, 可以换成 b = b ^ a , b = b ^ (a ^ b) ,相信大家明白了吧,异或是满足交换律的,先后的关系并不影响结果。if语句第三条,a 已经是 a 与 b 异或的结果,所以对 b 异或 (对之前 a 的值异或),得到了 b 的值。是不是很巧妙的?

位操作优势在于更接近计算机运算方式,程序性能得到了提升,减少空间的开销,这里就可以少用一个int 变量

这种思想可以用到哪里呢?比如一些招聘题:数组中每个数字都出现了两次,但有一次缺失了一个数字,求缺失的数字,

我们就可以把数组中每个数都异或一次,结果自然是那个缺失的数字,之后会给出程序,谢谢

大学生一枚,所有文章都是自己的笔记,来源于多处,欢迎指出错误,提出宝贵的意见。才开始写博客,没能好好组织语言,谢谢谅解。希望能与各位共同进步~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值