楼上的有个问题我很想不明白 为什么交换数字用 a-=b;b+=a;a=b-a; ? 无论从可读性,和运行速度上,你这都是走下策(用于加密或许有一点点迷惑别人的意思) 下面是int c=a;a=b;b=c;VC编译后的指令 int a=12,b=21;
0 q: g5 P( I6 [3 L8 ^+ fmov dword ptr [ebp-4],0Ch4 C0 V7 {0 a7 g R4 J6 d) Q5 U* A
mov dword ptr [ebp-8],15h% Y% ~; ^! d! K3 {2 @5 e
int c=a;1 s7 X1 I9 G2 I6 n; [0 F( {9 I* Q
mov eax,dword ptr [ebp-4]; p3 E! E) ?- n0 ]' f
mov dword ptr [ebp-0Ch],eax
) ^; W' ^2 _) q7 d9 e) Q a=b;8 y3 y! C7 g4 Q+ d2 u
mov ecx,dword ptr [ebp-8]
2 b. k) a `) c) Q0 ] mov dword ptr [ebp-4],ecx2 `& B! V! V2 M. u6 ~) ? V( m
b=c;
4 e* ~5 k2 k3 w( L% ymov edx,dword ptr [ebp-0Ch]0 l9 k5 Q9 g3 v" y: w
mov dword ptr [ebp-8],edx 下面是你的方法VC编译后的指令 a=12,b=21;
2 @( I/ G# v0 ]mov dword ptr [ebp-4],0Ch
% q9 U9 l3 w* [# n/ k1 Amov dword ptr [ebp-8],15h& h1 \+ m4 ]1 w* N1 M s
a-=b;4 W. j/ x" p5 f! e6 a' I" Z: O
mov eax,dword ptr [ebp-4]
: e& g o d, @0 m' R b0 F/ n0 esub eax,dword ptr [ebp-8]
( C: d6 E: ^0 e. Smov dword ptr [ebp-4],eax! f9 h% E/ h* d2 ~+ O
b+=a;
' r9 f* n% |& Jmov ecx,dword ptr [ebp-8]
6 _; P) l* P, @ T1 d$ yadd ecx,dword ptr [ebp-4]
" Q" y- t# _+ W- N' B1 z( umov dword ptr [ebp-8],ecx
" y: j2 _$ U- V' ~4 t7 f a=b-a;0 l' ]. Y' ~, o: r7 Q7 J9 z m% t
mov edx,dword ptr [ebp-8]) a1 t O2 {5 p% B( u1 ]: K) n# n
sub edx,dword ptr [ebp-4]
/ _3 m7 e' A% c0 P3 Amov dword ptr [ebp-4],edx
9 j8 g& X1 `' L0 {% r 很明显正规方法只有8条Mov指令, 而你的方法有8条Mov指令和2条Sub指令和1条Add指令 要知道,和Mov指令比起来Sub指令,Add指令是很费时间的! |