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

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
前些天论坛有人问了一个简单的问题:“怎么交换两组数?”
1 U5 a/ \; g3 t  p+ a! B/ P1 A当时有人回答用中间变量,这是一种常用的方法。这个思路好比以下例子:一杯果汁A、一碗牛奶B,现在要互换一下容器,即把A换到碗里,B换到杯里。只有借助第3个容器C。操作是A--->C,B---->A,C----->B,这样才能完成交换。5 G% _% g9 K- g. I; E
有人回答用加减法,思路不错:* _) r! B* P$ ]' o* {& a) @# b
a=3;b=5;
. K. A" I( G2 Z  Za=a+b;         
4 i4 T0 z6 U/ u( {/ @# \  B* Wb=a-b;) `4 H: l, n: H+ D' A1 Z
a=a-b;
) D& d; O+ Q- N1 a- w' o9 H/ }: u9 J但当时我提出有溢出问题,如235+122怎么办,设定a、b均为unsigned char;如果均为unsigned int同样有问题,不能用程序来限定a、b值的范围,特别是ADC的值。- T# n" L- M) M. g' }# p

" N* C0 C: ?) ~& ^/ m) p2 r$ V( x. x6 Z我日志记录的不用中间数交换两个变量的方法,均利用C语言的异或运算。
3 X, ]$ D) d( a. g$ l5 Y" Q异或逻辑:对应的位相比较,同=0,异=1,实际上可以理解就“按位求异”,即“异为真,同为假”6 e2 `% X% N3 A; o: y: e& k
举例:5 S7 {/ g- b2 b7 w7 g
xxxx 1001  ^   0000 1111 = xxxx 0110(后4位翻转)
& b- ^1 c$ J  \% Q: `$ D: `xxx1 xxxx  ^      1 0000 =xxx0 xxxx   * F: i" n& T* r; ]6 _' x$ Y6 X
xxx0 xxxx  ^      1 0000 =xxx1 xxxx  
) _6 h, F/ ~1 I
, ~' |1 [; B1 |6 R1 ^程序如下:
. ~( w3 Q. C; A4 }  B- B. Xunsigned int aa=3456,bb=7890;
" \% B% m) B9 z: dvoid main( void )
8 j3 S2 e" j/ s5 `{
6 z, a1 f8 K0 v  aa=aa^bb;! m8 p7 }( c& b. {; W5 m
  bb=bb^aa;( V0 [2 q3 p& E. z6 j1 u8 \
  aa=aa^bb;
' f/ ^- k8 }1 A! ]+ j}- y2 H) k6 [5 T5 t- e; B
运行结果见图片。
6 S; E  I4 k2 \8 m% i' y$ N " v$ y0 p5 x1 p: R( V
, I# N/ E2 A7 e' P: U
) B( s) w. i1 n# K  i% b) w5 g

该用户从未签到

推荐
发表于 2022-5-23 11:12 | 只看该作者
可以利用C语言的异或运算。! n1 O5 W/ o# b7 N6 O8 ?

该用户从未签到

3#
发表于 2022-5-23 11:22 | 只看该作者
可以利用C语言的异或运算。  B  k& m- \0 C7 U
异或三角。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 16:55 , Processed in 0.125000 second(s), 27 queries , Gzip On.

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

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

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