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

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
前些天论坛有人问了一个简单的问题:“怎么交换两组数?”
" `6 a8 F+ s4 k( U$ o4 {当时有人回答用中间变量,这是一种常用的方法。这个思路好比以下例子:一杯果汁A、一碗牛奶B,现在要互换一下容器,即把A换到碗里,B换到杯里。只有借助第3个容器C。操作是A--->C,B---->A,C----->B,这样才能完成交换。
) r' v. @8 f% y& n7 B, \5 k6 ^有人回答用加减法,思路不错:
/ j" M6 r  L# {a=3;b=5;
% i# V- f7 o% P; `2 A' w3 g" I3 J% ua=a+b;         
. V# m1 ~& y* h# e- _b=a-b;
: G4 n) S% Z) B( Ga=a-b;
6 E1 O5 |% a+ P/ p7 k; r但当时我提出有溢出问题,如235+122怎么办,设定a、b均为unsigned char;如果均为unsigned int同样有问题,不能用程序来限定a、b值的范围,特别是ADC的值。
( P7 W; \  S. l
' P# E# L1 L$ x3 K+ T7 w8 d我日志记录的不用中间数交换两个变量的方法,均利用C语言的异或运算。
: l- g) _6 ?7 O* G% E$ B异或逻辑:对应的位相比较,同=0,异=1,实际上可以理解就“按位求异”,即“异为真,同为假”" k/ |* w! V9 t) c1 B/ w/ y  x
举例:' J( l9 v; n. G1 _, N* e
xxxx 1001  ^   0000 1111 = xxxx 0110(后4位翻转)  O+ G; d% i+ Q' N/ S% q; \1 {
xxx1 xxxx  ^      1 0000 =xxx0 xxxx   ) J- ^& j3 [( D9 H" r5 C4 ?' w5 p
xxx0 xxxx  ^      1 0000 =xxx1 xxxx  
6 y/ k; Y; F7 J$ x% J4 P
  c/ J- ]8 W; j" h: K程序如下:+ n% z7 S& d0 g) `+ J
unsigned int aa=3456,bb=7890;" g' ]* p% U/ w" f  E
void main( void )
- w- t% |9 G& V{
1 h+ l3 ^+ Z6 r$ N* a0 \  aa=aa^bb;' y; o% F1 k, t7 v2 R8 D
  bb=bb^aa;
+ f8 ^: g/ M6 h1 d  aa=aa^bb;
6 P# G5 y$ d4 Y}
9 C/ e& M1 E0 T9 E3 x运行结果见图片。
& \6 T( K8 w3 Y: H4 q
7 g! q, w; h* X) d& L% n& t) i2 K
" X3 R- ^) d8 m0 p5 F% i" m+ d' f9 i2 g2 `: K' |

该用户从未签到

推荐
发表于 2022-5-23 11:12 | 只看该作者
可以利用C语言的异或运算。
) h  f) F3 B/ O# M4 g) W0 o

该用户从未签到

3#
发表于 2022-5-23 11:22 | 只看该作者
可以利用C语言的异或运算。
  n; ?. A5 u. `, }& b( R( s异或三角。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-12 05:55 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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