楼上的有个问题我很想不明白 为什么交换数字用 a-=b;b+=a;a=b-a; ? 无论从可读性,和运行速度上,你这都是走下策(用于加密或许有一点点迷惑别人的意思) 下面是int c=a;a=b;b=c;VC编译后的指令 int a=12,b=21;0 u2 _8 e1 S0 H" f* K* s0 [1 }$ ?$ o, N
mov dword ptr [ebp-4],0Ch
8 r' P4 [4 e0 i# |; imov dword ptr [ebp-8],15h! Z* |: {& L+ a' F6 M5 ^+ w
int c=a;5 R* X. {4 f$ O5 l' S0 o8 h
mov eax,dword ptr [ebp-4]
+ }8 b8 g" {0 n- O! Q/ ~# h# k' Wmov dword ptr [ebp-0Ch],eax
. r. E! @' o1 R2 G a=b;
* N2 N3 r# M$ h* l! d mov ecx,dword ptr [ebp-8]& C3 o/ w6 H9 C% c
mov dword ptr [ebp-4],ecx
5 `. v+ f# J5 |- _8 |+ i b=c;
; Q: p4 w0 l. a* X; T$ Qmov edx,dword ptr [ebp-0Ch]
) r. O- G3 s- P: \mov dword ptr [ebp-8],edx 下面是你的方法VC编译后的指令 a=12,b=21;
8 @- b' Z0 o% O! u, ]/ T) _( Mmov dword ptr [ebp-4],0Ch
, c" z, |! [8 [; e$ ]mov dword ptr [ebp-8],15h4 G9 Z: M" f" S8 W4 s, I1 b
a-=b;
+ ~7 K8 r, N q; n# ^6 `: rmov eax,dword ptr [ebp-4]/ A; E* b* h* p3 F8 q$ _% U6 G
sub eax,dword ptr [ebp-8]( f2 z& q e2 }# x; f5 M( U& @
mov dword ptr [ebp-4],eax/ o3 J9 E. |- B+ \
b+=a;
( K7 N& O& f; p- M/ @3 jmov ecx,dword ptr [ebp-8]
, t! p+ F% x" @" E! T: {( H# Badd ecx,dword ptr [ebp-4]8 C9 U- V! R; ]) K. y
mov dword ptr [ebp-8],ecx
+ D: p5 ^. S: T: u, i( g" G0 O2 j a=b-a;
7 C" W6 d4 y- k, [3 }mov edx,dword ptr [ebp-8]5 n) e+ C$ w9 e) }
sub edx,dword ptr [ebp-4]4 |- W5 m% s6 y8 m
mov dword ptr [ebp-4],edx
; F, s3 R' J: g 很明显正规方法只有8条Mov指令, 而你的方法有8条Mov指令和2条Sub指令和1条Add指令 要知道,和Mov指令比起来Sub指令,Add指令是很费时间的! |