搜索
bottom↓
回复: 52

不使用第三个变量完成x和y变量值交换,你会吗?

[复制链接]

出0入0汤圆

发表于 2015-3-19 14:55:15 | 显示全部楼层 |阅读模式
不使用第三个变量完成x和y变量值交换。
前两天编写迪文屏程序遇到该问题,当时没有解决,今天在看CRC校验时找到了答案,其实这些都是数学知识,大学毕业后把数学忘的差不多了。哎~

出0入0汤圆

发表于 2015-3-19 14:59:54 | 显示全部楼层
移位???????????????

出0入0汤圆

发表于 2015-3-19 15:01:34 | 显示全部楼层
两次异或.不过这是里有个陷阱,不建议这样处理.

出0入0汤圆

发表于 2015-3-19 15:06:16 | 显示全部楼层
int x=1,y=2;
System.out.println("x="+x+" y="+y);
x=x^y;
y=x^y;
x=x^y;
System.out.println("x="+x+" y="+y);

出0入0汤圆

发表于 2015-3-19 15:10:05 | 显示全部楼层
x=x+y;
y=x-y;
x=x-y;
不过不建议这样操作。

出0入0汤圆

发表于 2015-3-19 15:10:29 | 显示全部楼层
本帖最后由 sibtck 于 2015-3-19 15:12 编辑
dmmcu 发表于 2015-3-19 15:06
int x=1,y=2;
System.out.println("x="+x+" y="+y);
x=x^y;


a ^= a;
a ^= a;
a ^= a;

=>    a=0...

所以执行前要判断这两个数地址是否相等.

出0入0汤圆

发表于 2015-3-19 15:12:20 | 显示全部楼层
LZ在LZ位说找到答案了,能共享出来不?

出0入0汤圆

 楼主| 发表于 2015-3-19 15:17:38 | 显示全部楼层
黑夜之狼 发表于 2015-3-19 15:12
LZ在LZ位说找到答案了,能共享出来不?

楼上已有答案,该问题在这里肯定不是问题,但对像我这样不好好学习的是个问题,发出感叹一下数学太差

出0入0汤圆

发表于 2015-3-19 15:19:40 | 显示全部楼层
程序是要写得清晰明了,易于维护,
没必要玩那么多花招,除非能极大的提高效率。

出0入0汤圆

发表于 2015-3-19 15:19:58 | 显示全部楼层
这个问题还真没想过呢?回头试试楼上高人的回答是否行得通。不过楼主可以说说答案啊。让我们见识一下。

出0入0汤圆

 楼主| 发表于 2015-3-19 15:20:42 | 显示全部楼层
sibtck 发表于 2015-3-19 15:10
a ^= a;
a ^= a;
a ^= a;

我找到的答案就是使用异或,该缺陷在什么情况下会出现。x、y是变量,不是指针,只用在嵌入式c语言中,还会存在此缺陷吗

出0入0汤圆

 楼主| 发表于 2015-3-19 15:23:36 | 显示全部楼层
myin4 发表于 2015-3-19 15:19
程序是要写得清晰明了,易于维护,
没必要玩那么多花招,除非能极大的提高效率。 ...

前两天就遇到该问题,但是发现寄存器已用完,所以只能重新分配寄存器,又多花了半天时间。当然,目前工作中遇到这类问题的机率是很小。

出0入0汤圆

发表于 2015-3-19 15:24:14 | 显示全部楼层
感觉还是增加一个变量好点,汇编上来说,效率也快(我只了解部分8位机的汇编)

出0入0汤圆

发表于 2015-3-19 15:26:03 | 显示全部楼层
XCHG呢?

出0入0汤圆

发表于 2015-3-19 15:27:30 | 显示全部楼层
本帖最后由 jacky_yhy 于 2015-3-19 15:29 编辑

很难么?x=x+y;y=x-y;x=x-y.
当时面试的时候被问到过这个问题。感叹有什么奇葩的地方要这么搞。今天居然见到了

出0入0汤圆

 楼主| 发表于 2015-3-19 15:32:27 | 显示全部楼层

交换函数吗?
前两天是在写迪文屏的OS程序中遇到的,这程序竟然要用类似汇编的语言写。

出0入0汤圆

发表于 2015-3-19 15:33:01 | 显示全部楼层
jacky_yhy 发表于 2015-3-19 15:27
很难么?x=x+y;y=x-y;x=x-y.
当时面试的时候被问到过这个问题。感叹有什么奇葩的地方要这么搞。今天居然见 ...

异或也行,你这个方法也蛮好的。。。。,谢!

出0入0汤圆

发表于 2015-3-19 15:34:58 | 显示全部楼层
另外我很好奇迪文的屏出到啥程度了?居然要这么操作?还是我原来用DGUS的方式太low了

出0入0汤圆

发表于 2015-3-19 15:35:20 | 显示全部楼层
tyoo 发表于 2015-3-19 15:32
交换函数吗?
前两天是在写迪文屏的OS程序中遇到的,这程序竟然要用类似汇编的语言写。 ...

https://en.wikibooks.org/wiki/X8 ... _Transfer#Data_swap

出0入0汤圆

发表于 2015-3-19 16:14:52 | 显示全部楼层
哎呀,表示没有思考过这个问题

出0入0汤圆

 楼主| 发表于 2015-3-19 16:18:40 | 显示全部楼层
jacky_yhy 发表于 2015-3-19 15:34
另外我很好奇迪文的屏出到啥程度了?居然要这么操作?还是我原来用DGUS的方式太low了 ...

也在用?
屏做主机访问从设备,MODBUS协议不写OS程序也能实现?

出0入0汤圆

发表于 2015-3-19 16:24:46 | 显示全部楼层
一个静态变量而已,何必啊

出0入0汤圆

发表于 2015-3-19 16:43:50 | 显示全部楼层
jswd0810 发表于 2015-3-19 15:09
为了省一个变量把自己搞死?

把简单的问题复杂化,看这逼装的。。。

出0入0汤圆

发表于 2015-3-19 16:55:31 | 显示全部楼层
我宁愿多用几个变量,也不把程序搞的自己都看不懂。

出0入8汤圆

发表于 2015-3-19 17:58:20 | 显示全部楼层
异或容易看懂还是赋值容易看懂?
异或运算快还是赋值运算快?
加减运算快还是赋值运算快?

多一个变量也就多临时占用一个寄存器而已,没必要给自己找麻烦。
程序优化的方向是速度快、代码量小、容易看懂,不管哪个方向来看都是多个变量更好些

出0入0汤圆

发表于 2015-3-19 20:00:17 来自手机 | 显示全部楼层
同意楼上说法。。

出0入0汤圆

发表于 2015-3-19 20:07:47 | 显示全部楼层
tyoo 发表于 2015-3-19 16:18
也在用?
屏做主机访问从设备,MODBUS协议不写OS程序也能实现?

我直接用的它自带的设备协议

出0入0汤圆

发表于 2015-3-19 20:16:09 | 显示全部楼层
liwei_jlu 发表于 2015-3-19 17:58
异或容易看懂还是赋值容易看懂?
异或运算快还是赋值运算快?
加减运算快还是赋值运算快?

同意~ 通俗易懂,方便日后维护~

出0入0汤圆

 楼主| 发表于 2015-3-19 20:20:00 | 显示全部楼层
jacky_yhy 发表于 2015-3-19 20:07
我直接用的它自带的设备协议

不用OS可以吗,我是在OS中调用RMODBUS命令实现

出0入0汤圆

发表于 2015-3-19 20:30:14 | 显示全部楼层
tyoo 发表于 2015-3-19 20:20
不用OS可以吗,我是在OS中调用RMODBUS命令实现

神马os?只要能用串口不就能匹配它的协议了吗

出0入0汤圆

发表于 2015-3-19 21:05:47 来自手机 | 显示全部楼层
jacky_yhy 发表于 2015-3-19 15:27
很难么?x=x+y;y=x-y;x=x-y.
当时面试的时候被问到过这个问题。感叹有什么奇葩的地方要这么搞。今天居然见 ...

x+y有可能溢出

出0入0汤圆

发表于 2015-3-19 21:52:59 | 显示全部楼层

溢出也没有关系的.

出0入0汤圆

 楼主| 发表于 2015-3-20 06:22:14 | 显示全部楼层
jacky_yhy 发表于 2015-3-19 20:30
神马os?只要能用串口不就能匹配它的协议了吗



如图,1、2分别是两个软件,2完成界面布局,1完成数据的处理、界面控件控件及串口控制。1是需要用类似汇编格式的语言编写的,官网称之为OS程序。
---------------------
图片挂了重新上传

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-3-20 07:30:51 | 显示全部楼层
这个还是算了吧,没有几个公司会建议这么干得

出0入0汤圆

发表于 2015-3-20 07:35:10 | 显示全部楼层
tyoo 发表于 2015-3-20 06:22
如图,1、2分别是两个软件,2完成界面布局,1完成数据的处理、界面控件控件及串口控制。1是需要用类似汇 ...

可以不用os的。只用DGUS软件(内部可配置),用它自带的设备协议(非modbus)。

出0入0汤圆

 楼主| 发表于 2015-3-20 09:05:11 | 显示全部楼层
jacky_yhy 发表于 2015-3-20 07:35
可以不用os的。只用DGUS软件(内部可配置),用它自带的设备协议(非modbus)。 ...


这份手册中没找到相关内容。
请教一下,如何使用?

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-3-20 10:09:57 | 显示全部楼层
tyoo 发表于 2015-3-20 09:05
这份手册中没找到相关内容。
请教一下,如何使用?

第十页2.3.4   自己看吧。实在不明白把它接个串口接电脑,你按屏幕上的按键你就明白了。
具体指令在13页

出0入0汤圆

发表于 2015-3-20 10:54:05 | 显示全部楼层
涨知识啊!

出0入0汤圆

 楼主| 发表于 2015-3-21 10:13:17 | 显示全部楼层
jacky_yhy 发表于 2015-3-20 10:09
第十页2.3.4   自己看吧。实在不明白把它接个串口接电脑,你按屏幕上的按键你就明白了。
具体指令在13页 ...

兄弟,帮忙出份详细的教程,到目前还未看懂,2.3.4不是说上位机控制DGUS屏吗?我需要的是用屏来控制其它设备,协议由其它设备决定。

出0入0汤圆

发表于 2015-3-21 21:38:47 | 显示全部楼层
tyoo 发表于 2015-3-21 10:13
兄弟,帮忙出份详细的教程,到目前还未看懂,2.3.4不是说上位机控制DGUS屏吗?我需要的是用屏来控制其它 ...

。。。。。。。
自学吧。。。。
我当初也是一步一步自己过来的。

出0入0汤圆

发表于 2015-3-21 21:54:29 | 显示全部楼层
不错,学习了

出0入0汤圆

发表于 2015-3-21 21:57:25 来自手机 | 显示全部楼层
知道即可,不建议使用。

出0入0汤圆

发表于 2015-4-8 14:21:55 | 显示全部楼层
非常感谢你的经验分享!

出0入0汤圆

发表于 2015-5-7 17:03:45 | 显示全部楼层
学习了,但是代码还是简单易懂的比较好维护吧

出0入0汤圆

发表于 2015-5-7 17:45:57 | 显示全部楼层
x ^= y ^= x ^= y;

出0入0汤圆

发表于 2015-5-7 22:48:07 | 显示全部楼层
x=x+y y=x-y x= x-y

出0入0汤圆

发表于 2015-5-8 08:37:15 | 显示全部楼层

你这个明显不对啊!

出0入0汤圆

发表于 2015-5-8 10:06:37 | 显示全部楼层
embeddev_1 发表于 2015-5-8 08:37
你这个明显不对啊!

你用x=5,y=6套进去试试再说。。。。

出0入0汤圆

发表于 2015-5-11 16:49:00 | 显示全部楼层
这个百度里有答案
关键知道是可行的人占不到50%,先不论值不值的省一个变量,但是方法和思路是可以学一学的

出0入0汤圆

发表于 2015-5-12 14:46:23 | 显示全部楼层
奇技淫巧~~~

出0入0汤圆

发表于 2015-5-12 15:03:44 | 显示全部楼层
和孔乙己的“茴”有异曲同工之妙。哈哈

出0入0汤圆

发表于 2015-5-12 15:41:02 | 显示全部楼层
本帖最后由 byrin219 于 2015-5-12 15:45 编辑


我都是这样用的,有什么问题呢?求指教,A=A+B;B=A-B;A=A-B
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 13:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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