楼上的有个问题我很想不明白 为什么交换数字用 a-=b;b+=a;a=b-a; ? 无论从可读性,和运行速度上,你这都是走下策(用于加密或许有一点点迷惑别人的意思) 下面是int c=a;a=b;b=c;VC编译后的指令 int a=12,b=21;( L _" L- V3 A9 p# P) }
mov dword ptr [ebp-4],0Ch9 ^4 H# D; G; b
mov dword ptr [ebp-8],15h3 ^ p3 E! q$ I9 R* r& a6 Z. p
int c=a;
5 t% b5 z1 g* g7 Emov eax,dword ptr [ebp-4]
0 i$ ^2 B( _$ P' H- M7 i5 }9 a+ b0 d/ mmov dword ptr [ebp-0Ch],eax
' ]' ?4 p1 K9 q1 r( |& J a=b;
5 w4 E; }1 j6 M' R) [ mov ecx,dword ptr [ebp-8]
1 v" s2 d+ \! C* z3 {1 C mov dword ptr [ebp-4],ecx' ?1 v2 r4 [, \5 x
b=c;
% e0 M' I; ]( B/ k( d) Z [! Emov edx,dword ptr [ebp-0Ch]3 m$ _) d; t/ U& M7 m# f
mov dword ptr [ebp-8],edx 下面是你的方法VC编译后的指令 a=12,b=21;
0 j6 h4 f" F: ?6 M1 z* o4 Tmov dword ptr [ebp-4],0Ch& A3 O8 V: n! F! g0 C8 h
mov dword ptr [ebp-8],15h
$ X" M9 y+ W5 y% G+ L: D5 H a-=b;. t9 n. X+ w* H
mov eax,dword ptr [ebp-4]# L6 i+ e* h+ l" f" E5 p1 ^1 v
sub eax,dword ptr [ebp-8]# b$ `- W# `3 W1 B; m
mov dword ptr [ebp-4],eax
0 P' F$ w5 Z2 k/ u b+=a;
; Y: i) }; e. ?' Fmov ecx,dword ptr [ebp-8]
0 K- U7 D% {3 g0 M4 n Fadd ecx,dword ptr [ebp-4]
. E3 f) b! ~4 F! ^ ymov dword ptr [ebp-8],ecx
& ?4 ^* \2 t% B9 Y" C K" `1 Y a=b-a;( m$ l) K( k& Y* y" @8 \8 a6 f
mov edx,dword ptr [ebp-8]0 J0 a( a8 l) ^0 w
sub edx,dword ptr [ebp-4]7 `" b* J `: |* l; j- k
mov dword ptr [ebp-4],edx
, G( L0 M; O+ J# [+ U 很明显正规方法只有8条Mov指令, 而你的方法有8条Mov指令和2条Sub指令和1条Add指令 要知道,和Mov指令比起来Sub指令,Add指令是很费时间的! |