不用第三个变量交换两变量值的几种方式

变量a=10,b=20,不借助第三个变量实现两变量值的交换。

1、算术运算

好久之前就看见过这道题,当时只知道是用异或^解决,后来也看到了有人用加减或乘除解决,这种算术运算很好理解代码贴在下面。

加减实现:

a = 10
b = 20
a = a + b
b = a - b
a = a - b
print(a, b)  # 20 10

乘除实现:

a = 10
b = 20
a = a * b
b = a / b
a = a / b
print(a, b)  # 20.0   10.0   小数点是因为python中除法结果为浮点型

2、异或(^)

对异或的简单概述就是相同为假(0),相异为真(1)。

异或操作主要的关键点在于:假设a^b=c,则c^b=a,c^a=b,也就是说一个数连续异或同一个数两次结果不变。

我们都知道计算机中数据都是以二进制形式存储的,现在任意假设两个变量a, b的二进制,a=101101,b=001010,a^b^b=a^(b^b),而根据异或的定义,任意数和自身异或都会等于0,例如上述b^b=001010^001010=000000。同样根据异或的定义,任何数和0异或都会等于这个数本身,就像a^0=101101^000000=101101。

搞清了异或的逻辑,代码就很容易写出来了

# 异或实现
a = 10
b = 20
a = a ^ b
b = a ^ b
a = a ^ b
print(a, b)  # 20   10

3、python中的拆包装包

a = 10
b = 20
a, b = b, a
print(a, b)  # 20    10

PS:关于异或的一道sql题

刷题时遇到,https://leetcode.cn/problems/exchange-seats/description/

下面有个题解使用的是异或对相邻连续的两个id进行互换,用的是(id+1)^1-1,下面记录下怎么理解这个式子。

首先一个数id^1,最终的结果分为两种情况:
1)id为奇数时,最后一位为1,^01只会改变最后一位为0,此时id^1=id-1。
2)id为偶数时,最后一位为0,^01只会改变最后一位为1,此时id^1=id+1。
对于 1, 2, 3, 4, … 这样的序列,要想奇偶之间两两交换成 2, 1, 4, 3, … 这样,只要保证所给序列第一位为偶数后面依次递增就行了,因此可以使用题解中的(id+1)^1-1,后面-1是因为id在异或之前已经+1。按照这个思路将题解中的(id+1)^1-1改成(id-1)^1+1也是没问题的。

with t as(
	select 1 as id union all
	select 2 as id union all
	select 3 as id union all
	select 4 as id union all
	select 5 as id union all
	select 6 as id
)
select 
	id,
	id^1,
	(id+1)^1-1,
	(id-1)^1+1
from t;

在这里插入图片描述

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值