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

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

2007-5-21 10:29
16673

如题,变量A,B进行互换,但不许使用第三个中间变量,如何实现?


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (38)
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
2
假设a b 不等
a = a^b
b = b^a
a = a^b
2007-5-21 10:32
0
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
delphi

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

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
2007-5-21 12:01
0
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
8
[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对他们做过优化。
2007-5-21 12:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whl
9
学习啊   ;
2007-5-21 13:39
0
雪    币: 267
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
不会吧
push和pop还有一个改变sp/esp的动作
其实对于现在的cpu区别应该不大了,
流水线,多级缓存。。。
2007-5-21 13:40
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
11
[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
--------
你们这样把人家都弄糊涂了,呵呵呵呵
2007-5-21 15:21
0
雪    币: 297
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
12
异或 可能是最好的,那个push pop 还是用到了其他存储部分。

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

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



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