找回密码
 注册
关于网站域名变更的通知
查看: 230|回复: 3
打印 上一主题 下一主题

不用中间数交换两个变量的方法

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-5-23 09:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
前些天论坛有人问了一个简单的问题:“怎么交换两组数?”
- n3 n% R4 d+ u8 b当时有人回答用中间变量,这是一种常用的方法。这个思路好比以下例子:一杯果汁A、一碗牛奶B,现在要互换一下容器,即把A换到碗里,B换到杯里。只有借助第3个容器C。操作是A--->C,B---->A,C----->B,这样才能完成交换。! E+ j7 \+ r9 B# `
有人回答用加减法,思路不错:
2 N# d  Q1 X. K! ~4 H& sa=3;b=5; $ z  S, i1 R+ r+ A( h/ B4 {/ A  m  l
a=a+b;         
: ^5 P, l( N9 Y- C- N2 P7 u# n4 }b=a-b;
9 G4 e/ t+ J; Ta=a-b;
& R/ j  e3 f8 _但当时我提出有溢出问题,如235+122怎么办,设定a、b均为unsigned char;如果均为unsigned int同样有问题,不能用程序来限定a、b值的范围,特别是ADC的值。- H: N8 s, E" C% c
  p1 X  @/ Q! b; B6 @
我日志记录的不用中间数交换两个变量的方法,均利用C语言的异或运算。
! d8 ?+ Q! O5 J异或逻辑:对应的位相比较,同=0,异=1,实际上可以理解就“按位求异”,即“异为真,同为假”
0 ]0 ^, C% O: R# Z  d+ J举例:
3 n7 l0 X8 W) xxxxx 1001  ^   0000 1111 = xxxx 0110(后4位翻转)
3 c" F4 Y7 L* C; b$ }: Zxxx1 xxxx  ^      1 0000 =xxx0 xxxx   
/ Z6 C2 L; X( A# N) mxxx0 xxxx  ^      1 0000 =xxx1 xxxx  0 x# s# Z% i0 V- \

8 d) g& Q& }4 H! z  O% A程序如下:) P# q2 k/ s8 B% w
unsigned int aa=3456,bb=7890;% d( g  u" P* i! _, U. E  i3 r
void main( void )
/ F- t7 E1 V: Q/ h, J{
* i+ d; R$ e: r% p8 R  aa=aa^bb;3 N2 _1 `9 Z2 G" K( Z/ b
  bb=bb^aa;
4 h' W) i! V) f5 \  u  aa=aa^bb;
( `  M4 q( s1 e( G7 J}
4 }) X" ?$ L: K运行结果见图片。5 B# x: R2 l6 T9 Q! H

$ \2 l# E1 Y3 o" F) s7 l. z) U6 _ + t% o3 ?- m) O6 ]8 V( P2 }

/ V& @7 b7 Z8 W3 G, }2 |: c- D

该用户从未签到

推荐
发表于 2022-5-23 11:12 | 只看该作者
可以利用C语言的异或运算。% `4 |1 ~2 @) d9 a6 w6 z& t

该用户从未签到

3#
发表于 2022-5-23 11:22 | 只看该作者
可以利用C语言的异或运算。
, v8 O' `4 `. o7 c异或三角。

该用户从未签到

4#
发表于 2022-5-23 13:37 | 只看该作者
嗯嗯嗯。学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-20 04:16 , Processed in 0.125000 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表