tyoo 发表于 2015-3-19 14:55:15

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

不使用第三个变量完成x和y变量值交换。
前两天编写迪文屏程序遇到该问题,当时没有解决,今天在看CRC校验时找到了答案,其实这些都是数学知识,大学毕业后把数学忘的差不多了。哎~

黄晨0410 发表于 2015-3-19 14:59:54

移位???????????????

sibtck 发表于 2015-3-19 15:01:34

两次异或.不过这是里有个陷阱,不建议这样处理.

dmmcu 发表于 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);

lans0625 发表于 2015-3-19 15:10:05

x=x+y;
y=x-y;
x=x-y;
不过不建议这样操作。

sibtck 发表于 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...

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

黑夜之狼 发表于 2015-3-19 15:12:20

LZ在LZ位说找到答案了,能共享出来不?

tyoo 发表于 2015-3-19 15:17:38

黑夜之狼 发表于 2015-3-19 15:12
LZ在LZ位说找到答案了,能共享出来不?

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

myin4 发表于 2015-3-19 15:19:40

程序是要写得清晰明了,易于维护,
没必要玩那么多花招,除非能极大的提高效率。

jiang887786 发表于 2015-3-19 15:19:58

这个问题还真没想过呢?回头试试楼上高人的回答是否行得通。不过楼主可以说说答案啊。让我们见识一下。

tyoo 发表于 2015-3-19 15:20:42

sibtck 发表于 2015-3-19 15:10
a ^= a;
a ^= a;
a ^= a;


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

tyoo 发表于 2015-3-19 15:23:36

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

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

ijlc1314 发表于 2015-3-19 15:24:14

感觉还是增加一个变量好点,汇编上来说,效率也快(我只了解部分8位机的汇编)

dawanpi 发表于 2015-3-19 15:26:03

XCHG呢?

jacky_yhy 发表于 2015-3-19 15:27:30

本帖最后由 jacky_yhy 于 2015-3-19 15:29 编辑

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

tyoo 发表于 2015-3-19 15:32:27

dawanpi 发表于 2015-3-19 15:26
XCHG呢?

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

markdif 发表于 2015-3-19 15:33:01

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

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

jacky_yhy 发表于 2015-3-19 15:34:58

另外我很好奇迪文的屏出到啥程度了?居然要这么操作?还是我原来用DGUS的方式太low了{:lol:}

dawanpi 发表于 2015-3-19 15:35:20

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

https://en.wikibooks.org/wiki/X86_Assembly/Data_Transfer#Data_swap

张正一号 发表于 2015-3-19 16:14:52

哎呀,表示没有思考过这个问题

tyoo 发表于 2015-3-19 16:18:40

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

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

jinyi7016 发表于 2015-3-19 16:24:46

一个静态变量而已,何必啊

steaven2000 发表于 2015-3-19 16:43:50

jswd0810 发表于 2015-3-19 15:09
为了省一个变量把自己搞死?

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

XA144F 发表于 2015-3-19 16:55:31

我宁愿多用几个变量,也不把程序搞的自己都看不懂。

liwei_jlu 发表于 2015-3-19 17:58:20

异或容易看懂还是赋值容易看懂?
异或运算快还是赋值运算快?
加减运算快还是赋值运算快?

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

xzp21st 发表于 2015-3-19 20:00:17

同意楼上说法。。

jacky_yhy 发表于 2015-3-19 20:07:47

tyoo 发表于 2015-3-19 16:18
也在用?
屏做主机访问从设备,MODBUS协议不写OS程序也能实现?

我直接用的它自带的设备协议{:lol:}

deedeezi 发表于 2015-3-19 20:16:09

liwei_jlu 发表于 2015-3-19 17:58
异或容易看懂还是赋值容易看懂?
异或运算快还是赋值运算快?
加减运算快还是赋值运算快?


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

tyoo 发表于 2015-3-19 20:20:00

jacky_yhy 发表于 2015-3-19 20:07
我直接用的它自带的设备协议

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

jacky_yhy 发表于 2015-3-19 20:30:14

tyoo 发表于 2015-3-19 20:20
不用OS可以吗,我是在OS中调用RMODBUS命令实现

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

at90s 发表于 2015-3-19 21:05:47

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

x+y有可能溢出

hyz_avr 发表于 2015-3-19 21:52:59

at90s 发表于 2015-3-19 21:05
x+y有可能溢出

溢出也没有关系的.

tyoo 发表于 2015-3-20 06:22:14

jacky_yhy 发表于 2015-3-19 20:30
神马os?只要能用串口不就能匹配它的协议了吗


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

ccrt 发表于 2015-3-20 07:30:51

这个还是算了吧,没有几个公司会建议这么干得

jacky_yhy 发表于 2015-3-20 07:35:10

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

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

tyoo 发表于 2015-3-20 09:05:11

jacky_yhy 发表于 2015-3-20 07:35
可以不用os的。只用DGUS软件(内部可配置),用它自带的设备协议(非modbus)。 ...


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

jacky_yhy 发表于 2015-3-20 10:09:57

tyoo 发表于 2015-3-20 09:05
这份手册中没找到相关内容。
请教一下,如何使用?

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

FSL_TICS_ZP 发表于 2015-3-20 10:54:05

涨知识啊!

tyoo 发表于 2015-3-21 10:13:17

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

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

jacky_yhy 发表于 2015-3-21 21:38:47

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

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

holts2 发表于 2015-3-21 21:54:29

不错,学习了

DevLabs 发表于 2015-3-21 21:57:25

知道即可,不建议使用。

FSL_TICS_ZP 发表于 2015-4-8 14:21:55

非常感谢你的经验分享!

Lu.Shi 发表于 2015-5-7 17:03:45

学习了,但是代码还是简单易懂的比较好维护吧

snoopyzz 发表于 2015-5-7 17:45:57

x ^= y ^= x ^= y;

youmu 发表于 2015-5-7 22:48:07

x=x+y y=x-y x= x-y

embeddev_1 发表于 2015-5-8 08:37:15

lans0625 发表于 2015-3-19 15:10
x=x+y;
y=x-y;
x=x-y;


你这个明显不对啊!{:biggrin:}

lans0625 发表于 2015-5-8 10:06:37

embeddev_1 发表于 2015-5-8 08:37
你这个明显不对啊!

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

mcucow 发表于 2015-5-11 16:49:00

这个百度里有答案
关键知道是可行的人占不到50%,先不论值不值的省一个变量,但是方法和思路是可以学一学的

Juggernaut 发表于 2015-5-12 14:46:23

奇技淫巧~~~

xh2008email 发表于 2015-5-12 15:03:44

和孔乙己的“茴”有异曲同工之妙。哈哈

byrin219 发表于 2015-5-12 15:41:02

本帖最后由 byrin219 于 2015-5-12 15:45 编辑

lans0625 发表于 2015-3-19 15:10
x=x+y;
y=x-y;
x=x-y;


我都是这样用的,有什么问题呢?求指教,A=A+B;B=A-B;A=A-B
页: [1]
查看完整版本: 不使用第三个变量完成x和y变量值交换,你会吗?