首页
社区
课程
招聘
两个变量交换,不使用第三个变量如何实现?
2007-5-21 10:29 16103

两个变量交换,不使用第三个变量如何实现?

2007-5-21 10:29
16103
如题,变量A,B进行互换,但不许使用第三个中间变量,如何实现?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (38)
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 16 2007-5-21 10:32
2
0
假设a b 不等
a = a^b
b = b^a
a = a^b
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
nig 4 2007-5-21 11:03
3
0
delphi

asm
  mov eax, A
  mov edx,B
  xchg eax,edx
  mov A,Eax
  mov B,Edx
end;
雪    币: 8144
活跃值: (4442)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sunsjw 1 2007-5-21 11:08
4
0
谢谢楼上两位兄弟。昨天想了一天。。。
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
nig 4 2007-5-21 11:12
5
0
与上面重复,没有楼下的兄弟的经典!
雪    币: 255
活跃值: (207)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
peaceclub 6 2007-5-21 11:23
6
0
push a
push b
pop a
pop b
雪    币: 255
活跃值: (207)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
peaceclub 6 2007-5-21 12:01
7
0
既然这样了,为什么不如此操作?

asm
  mov eax,A
  mov edx,B
  mov A,edx
  mov B,eax
end;


如果是A,B是独立数的话,也可以:
  A=A+B
  B=A-B
  A=A-B
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
happytown 31 2007-5-21 12:37
8
0
[QUOTE=peaceclub;312371]既然这样了,为什么不如此操作?

asm
  mov eax,A
  mov edx,B
  mov A,edx
  mov B,eax
end;


如果是A,B是独立数的话,也可以:
  A=A+B
  B=A-B
  A=A-B[/QUOTE]

push和pop指令好像比mov快。因为intel对他们做过优化。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whl 2007-5-21 13:39
9
0
学习啊   ;
雪    币: 267
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Rinrin 1 2007-5-21 13:40
10
0
不会吧
push和pop还有一个改变sp/esp的动作
其实对于现在的cpu区别应该不大了,
流水线,多级缓存。。。
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
Aker 4 2007-5-21 15:21
11
0
[QUOTE=peaceclub;312371]既然这样了,为什么不如此操作?

asm
  mov eax,A
  mov edx,B
  mov A,edx
  mov B,eax
end;


如果是A,B是独立数的话,也可以:
  A=A+B
  B=A-B
  A=A-B[/QUOTE]

楼主的意思应该是这个,  
  A=A+B
  B=A-B
  A=A-B
--------
你们这样把人家都弄糊涂了,呵呵呵呵
雪    币: 297
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
默数悲伤 6 2007-5-21 20:42
12
0
异或 可能是最好的,那个push pop 还是用到了其他存储部分。

还有一个是
a += b;
b = a - b;
a = a - b;
只是这个可能存在溢出的可能性。
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zzsx 2007-5-22 05:40
13
0
a = a + b;
b = a - b;
a = a - b;
雪    币: 268
活跃值: (10)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
三根火柴 4 2007-5-22 12:15
14
0
没想到有这么多方法,我只知道 push a push b pop a pop b啊,又学了不少东西啊
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mengfeicv 2007-5-22 19:31
15
0
这个不是对栈吗?
咋不是先进后出啊?
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
antoym 1 2007-5-22 21:45
16
0
这个问题够经典!收益良多,多谢各位~
雪    币: 162
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
skyjackerg 2007-5-22 23:05
17
0
两个变量? bool,int,float....

A := B;
B := not A;
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ninja 2007-5-23 00:32
18
0
以前学GW Basic就遇到这个问题了
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NIU 2007-5-23 21:47
19
0
还有XCHG指令可以用
雪    币: 8144
活跃值: (4442)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sunsjw 1 2007-5-24 00:35
20
0
学了不少东西。没想到这么多强人。收获甚多。
雪    币: 268
活跃值: (95)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
chimney 3 2007-5-24 01:12
21
0
强人不少 ;学习了不少!



这不是要交换a,b 吗?
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
大菜一号 21 2007-5-24 09:02
22
0
支持沙发shoooo的异或
雪    币: 214
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
天涯浪人 2 2007-5-24 10:05
23
0
也支持xor,高
雪    币: 410
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Alax 2007-5-25 22:27
24
0
异或的方法,似乎在某个masm的例子文件里见过,记不清楚了
雪    币: 251
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
moon 5 2007-5-26 12:13
25
0
push和pop慢,我用rdtsc测试过
游客
登录 | 注册 方可回帖
返回