楼上的有个问题我很想不明白 为什么交换数字用 a-=b;b+=a;a=b-a; ? 无论从可读性,和运行速度上,你这都是走下策(用于加密或许有一点点迷惑别人的意思) 下面是int c=a;a=b;b=c;VC编译后的指令 int a=12,b=21;
: A6 m3 m* A! V* omov dword ptr [ebp-4],0Ch' G; p6 N8 z8 m: P; J
mov dword ptr [ebp-8],15h6 G7 F a5 d5 l3 R8 u3 a3 S# ]
int c=a;
# o6 Q9 }# d, L' Amov eax,dword ptr [ebp-4]
+ R8 h! S0 j: Rmov dword ptr [ebp-0Ch],eax
) Q" v0 I4 p: x3 o a=b;; F2 j7 J- Z+ x3 ~. `' V
mov ecx,dword ptr [ebp-8] n) d- p, b+ G) B. c
mov dword ptr [ebp-4],ecx0 ]1 B3 G" ~$ F6 w% E% k$ Q
b=c;8 {) U0 P/ ]5 [5 T' o
mov edx,dword ptr [ebp-0Ch]
% s8 g0 `* W3 }% @% y4 _( u qmov dword ptr [ebp-8],edx 下面是你的方法VC编译后的指令 a=12,b=21;
4 _: [7 L( f8 X) R- I8 f! gmov dword ptr [ebp-4],0Ch
, n& d, ]# B; S5 h1 {mov dword ptr [ebp-8],15h
! _- o5 s+ q* z, K& b a-=b;
1 K' O6 h* w) ^! @mov eax,dword ptr [ebp-4]- n) x5 v. p$ N, a; M( r
sub eax,dword ptr [ebp-8]
; j! o( A6 V3 F2 T, Z! ]6 Lmov dword ptr [ebp-4],eax! k3 t" j# U0 W" ]- @; O
b+=a;0 P' q! V$ K [, a2 k# s7 G4 e
mov ecx,dword ptr [ebp-8]
$ M8 ?; e; |: U& R7 S" u" \+ kadd ecx,dword ptr [ebp-4]
4 e5 V7 Q$ O' Z F8 A mmov dword ptr [ebp-8],ecx: F# C9 n/ ]! E, r/ {& c
a=b-a;8 M b' J8 Z; J7 H1 S6 q
mov edx,dword ptr [ebp-8]/ u$ ?, L. h' r/ V, K9 @0 V
sub edx,dword ptr [ebp-4] T. S7 D6 C* A* o- A- D
mov dword ptr [ebp-4],edx% p. P! Z" b) R& \8 Y
很明显正规方法只有8条Mov指令, 而你的方法有8条Mov指令和2条Sub指令和1条Add指令 要知道,和Mov指令比起来Sub指令,Add指令是很费时间的! |