找回密码
 注册
查看: 209|回复: 3
打印 上一主题 下一主题

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
前些天论坛有人问了一个简单的问题:“怎么交换两组数?”. g1 |5 n- G6 p+ `; m+ {
当时有人回答用中间变量,这是一种常用的方法。这个思路好比以下例子:一杯果汁A、一碗牛奶B,现在要互换一下容器,即把A换到碗里,B换到杯里。只有借助第3个容器C。操作是A--->C,B---->A,C----->B,这样才能完成交换。: h% P$ n' `6 R
有人回答用加减法,思路不错:
7 X5 M* J$ |. ]5 ?/ Ua=3;b=5; 8 \+ U0 y- Z5 e: M0 e$ g) l" w
a=a+b;         : }- v) x5 y/ ]0 h
b=a-b;$ F3 L" i4 m7 `8 b- x# E9 B, C+ r
a=a-b;
7 Z; r- l! P: l/ d但当时我提出有溢出问题,如235+122怎么办,设定a、b均为unsigned char;如果均为unsigned int同样有问题,不能用程序来限定a、b值的范围,特别是ADC的值。
- L8 Z9 n& i0 M+ h5 Y. y2 L; o5 J# P3 ]' i1 W3 D
我日志记录的不用中间数交换两个变量的方法,均利用C语言的异或运算。
5 Q$ O. p5 J! g8 R异或逻辑:对应的位相比较,同=0,异=1,实际上可以理解就“按位求异”,即“异为真,同为假”
$ m1 j/ Q9 E+ K5 Y  y举例:) i/ |9 V4 L; Y% ^$ i4 u$ `
xxxx 1001  ^   0000 1111 = xxxx 0110(后4位翻转)
# o  I/ t6 x9 L* F4 x( `xxx1 xxxx  ^      1 0000 =xxx0 xxxx   
1 }+ j2 _* ?8 Mxxx0 xxxx  ^      1 0000 =xxx1 xxxx  . b; A7 h, s9 y! S5 u. [

+ B$ R: R; a6 A4 D# s程序如下:
2 \# D  W7 R$ [' n9 }unsigned int aa=3456,bb=7890;  r6 m2 }# z) N7 V* s/ ?
void main( void )
( W0 Z* F- x" |{
4 e# P  E& h$ L" y  m  aa=aa^bb;% v% ~7 S+ P5 G& X4 ]. y
  bb=bb^aa;
/ a; J$ n3 {! f# y$ e, I  aa=aa^bb;
& I# ?, C$ _3 l) n# B}2 f5 S# A8 |& _
运行结果见图片。: e! [8 m" V* Q9 `% z# @/ d

5 K8 `/ n6 P5 e - B5 d! C$ o1 G1 `4 U3 ]
) u6 r! @! S. a: q0 G% w3 S

该用户从未签到

推荐
发表于 2022-5-23 11:12 | 只看该作者
可以利用C语言的异或运算。
* U- E  _3 y3 Z3 S( A' a  m

该用户从未签到

3#
发表于 2022-5-23 11:22 | 只看该作者
可以利用C语言的异或运算。1 L. v7 i$ P2 m3 J7 d
异或三角。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-2 05:14 , Processed in 0.078125 second(s), 27 queries , Gzip On.

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

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

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