楼上的有个问题我很想不明白 为什么交换数字用 a-=b;b+=a;a=b-a; ? 无论从可读性,和运行速度上,你这都是走下策(用于加密或许有一点点迷惑别人的意思) 下面是int c=a;a=b;b=c;VC编译后的指令 int a=12,b=21;
* i/ g9 F `* j0 }* [mov dword ptr [ebp-4],0Ch" K# u( ?: D% ~, g
mov dword ptr [ebp-8],15h, k9 p3 h: R$ H" W0 h( o1 D& M
int c=a;
2 w) S _, j# [+ }8 R, t. ~( z7 jmov eax,dword ptr [ebp-4]
, e8 y" d8 L9 L7 k' @0 c; Vmov dword ptr [ebp-0Ch],eax
4 O& r6 d# l! \. _9 {& c a=b;0 t& j# |& C! @8 Q ~ E
mov ecx,dword ptr [ebp-8]- d* t! {: h2 i0 W! S( _
mov dword ptr [ebp-4],ecx
4 X9 [- B2 m; S2 ~- @ b=c;
) l( w( _' ?- H2 D) Cmov edx,dword ptr [ebp-0Ch]5 @1 @% y1 @; V- B
mov dword ptr [ebp-8],edx 下面是你的方法VC编译后的指令 a=12,b=21;
( ]$ L2 \3 l( S) B5 Lmov dword ptr [ebp-4],0Ch- }" ~* r Q- S! w0 Y
mov dword ptr [ebp-8],15h' f" h& l/ S* \
a-=b;
# P( Q* j/ e( _$ emov eax,dword ptr [ebp-4]
K' ~4 U" y7 g) k+ O0 t8 }% hsub eax,dword ptr [ebp-8]# t! k2 S( i2 o! m
mov dword ptr [ebp-4],eax" n3 Z, B9 o( A$ c+ w8 L2 l
b+=a;
% g) a7 X) t; k2 Tmov ecx,dword ptr [ebp-8], {- R: ~" a: f: b5 a4 b
add ecx,dword ptr [ebp-4]
8 C1 R, G5 V; m- u$ G! J% kmov dword ptr [ebp-8],ecx
/ \2 r* l2 {, s; b9 Q9 J a=b-a;
6 ?" v3 |" q$ ]mov edx,dword ptr [ebp-8]
: @: p8 t: f4 ?7 R" D. G9 Wsub edx,dword ptr [ebp-4]# L; w5 \7 o2 l
mov dword ptr [ebp-4],edx: E1 Y C k- I% L% m5 I% D
很明显正规方法只有8条Mov指令, 而你的方法有8条Mov指令和2条Sub指令和1条Add指令 要知道,和Mov指令比起来Sub指令,Add指令是很费时间的! |