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

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
前些天论坛有人问了一个简单的问题:“怎么交换两组数?”
7 u9 d/ q; w2 V$ D: k当时有人回答用中间变量,这是一种常用的方法。这个思路好比以下例子:一杯果汁A、一碗牛奶B,现在要互换一下容器,即把A换到碗里,B换到杯里。只有借助第3个容器C。操作是A--->C,B---->A,C----->B,这样才能完成交换。
2 s1 Y& E& Q5 b+ l' O, }! P- W& m( |有人回答用加减法,思路不错:* E2 h9 s4 G5 c9 Y6 p* J$ S' ?+ O, K
a=3;b=5;   p& C3 Y5 E3 l: h5 M6 b9 X% \, e# w
a=a+b;         ; j! j% z3 d3 z
b=a-b;
8 F; S; M+ H( b- L8 g$ L( Ja=a-b;
( W5 e# D) i1 ~6 _- E8 b) X但当时我提出有溢出问题,如235+122怎么办,设定a、b均为unsigned char;如果均为unsigned int同样有问题,不能用程序来限定a、b值的范围,特别是ADC的值。+ a7 m. Z  h/ ^7 M
/ @( S% _: U$ W9 l$ ]
我日志记录的不用中间数交换两个变量的方法,均利用C语言的异或运算。
. a7 A& E( u. c3 L8 V; U$ r异或逻辑:对应的位相比较,同=0,异=1,实际上可以理解就“按位求异”,即“异为真,同为假”/ V# |# A0 `" G  C) ?, r  r( M/ U
举例:
' B# E" _8 H3 a" ]; H! ixxxx 1001  ^   0000 1111 = xxxx 0110(后4位翻转)# N8 L- r* C/ q# T; K
xxx1 xxxx  ^      1 0000 =xxx0 xxxx   
# O& i/ T* V, ~1 c5 o( k1 Xxxx0 xxxx  ^      1 0000 =xxx1 xxxx  
0 J" Z$ n0 y/ z- Q! l3 W
! {3 a/ {; u- Z9 g: t程序如下:
# v' D( w/ F5 Z5 Q( M+ runsigned int aa=3456,bb=7890;- w( G$ S# K" Z* S+ x7 w5 ?
void main( void )0 b4 E+ I+ f! A- Y: a
{
% V6 Z4 u1 n) I' d0 E  aa=aa^bb;) r9 y6 q" m! m; C
  bb=bb^aa;
( A+ r/ Q4 p& g2 w' h+ o6 k  aa=aa^bb;
% Y/ G5 E& b7 e& n! e9 i) D$ E! q2 h}
4 z1 b  a  \; Z3 P0 I9 `  b运行结果见图片。
9 q: X- H0 {) H- j& t$ s + ?$ l6 J1 Z' y' b# \; R
5 p) \+ `2 d% a5 w

) K& R8 g# X4 Y

该用户从未签到

推荐
发表于 2022-5-23 11:12 | 只看该作者
可以利用C语言的异或运算。( r) A, E9 A+ r, b2 Q) X3 Q

该用户从未签到

3#
发表于 2022-5-23 11:22 | 只看该作者
可以利用C语言的异或运算。- [3 u, w, N& y9 o  j: R  N
异或三角。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 14:30 , Processed in 0.109375 second(s), 27 queries , Gzip On.

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

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

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