C ++ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд░рдирдЯрд╛рдЗрдо рдХрд╛ рдЕрдиреБрдХреВрд▓рди (рд╕рд╢рд░реНрдд рд╕рдВрдХреНрд░рдордг рд╣рдЯрд╛рдПрдВ)

рдПрд▓рдбреАрдкреАрд╕реА рдбрд┐рдХреЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╕рдордп, рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдирд┐рдореНрди рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ:
рдЫрд╡рд┐
рдЬрд╣рд╛рдВ рдФрд░ рдмреА рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИрдВред рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рд╛рдЦреЛрдВ рдореЗрдВ рдЪрд▓реА рдЧрдИ, рдФрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ рд╕рд░рд▓ рдФрд░ рдЕрдкрд░рд┐рд╖реНрдХреГрдд:

int LLR(int a, int b) { if (a>0) return (b>0) ? __min(a,b) : -__min(a,-b); else return (b>0) ? -__min(-a,b) : __min(-a,-b); } 


рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рддреАрди рдЕрдиреБрдХреНрд░рдорд┐рдХ рддреБрд▓рдирд╛ рд╕рдВрдЪрд╛рд▓рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╕рдВрдХрд▓рдХ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП) рджреЛ (рдпрджрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдХреЗрддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛) рдпрд╛ рддреАрди (рдпрджрд┐ рдПрдХ) рд╕рд╢рд░реНрдд рд╕рдВрдХреНрд░рдордг рджреЗрддрд╛ рд╣реИред рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рд╢рд░реНрдд рд╕рдВрдХреНрд░рдордгреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд▓рд╛рдЗрди рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП, рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдирд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛
рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛
 #include <Windows.h> static inline int LLR(int a, int b) { if (a>0) return (b>0) ? __min(a,b) : -__min(a,-b); else return (b>0) ? -__min(-a,b) : __min(-a,-b); } int _tmain(int argc, _TCHAR* argv[]) { SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL); srand(0); int x(0); __int64 t1,t2; QueryPerformanceCounter((LARGE_INTEGER*)&t1); for (size_t i=0;i<MAXUINT>>4;i++) { int a = rand() - RAND_MAX / 2; int b = rand() - RAND_MAX / 2; /* x += LLR(a,b);*/ } QueryPerformanceCounter((LARGE_INTEGER*)&t2); t2 -= t1; QueryPerformanceFrequency((LARGE_INTEGER*)&t1); _tprintf_s(_T("%f"),t2/(t1*1.)); return 0; } 


X86 рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕) рдореЗрдВ MSVS 2008 рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде рдЪрдХреНрд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, QueryPerformanceCounter () рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╕реНрд╡рдпрдВ рд╣реА рдзреАрдореА рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣ рдЪрдХреНрд░ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдкрд░рд┐рдгрд╛рдо рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдХреГрддрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ)ред рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХрдИ рдмрд╛рд░ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рд╣реИред 3.4 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬрд╝ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдЗрдВрдЯреЗрд▓ рдХреЛрд░ i7-3770 рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд▓реА рдорд╢реАрди рдкрд░, рдФрд╕рдд рд░рдирдЯрд╛рдЗрдо 9.2 рд╕реЗрдХрдВрдб рд╣реИред рдпрджрд┐ рдЖрдк рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХреЛ рдЕрдирд╕реБрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдФрд░ рдкреНрд░рдпреЛрдЧ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВ, рд╣рдореЗрдВ рд▓рдЧрднрдЧ 11.5 рд╕реЗрдХрдВрдб рдорд┐рд▓рддреЗ рд╣реИрдВред рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рд▓рдбрд╝реЗрдВрдЧреЗред

рдЪрд▓реЛ рд╕рд╢рд░реНрдд рдмрдпрд╛рдиреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрддреНрдкрд╛рдж рдП рдФрд░ рдмреА рдХреЗ рд╕рдВрдХреЗрдд рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред рд╕рдВрднрд╛рд╡рд┐рдд рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдХрд╛рд░рдг рдорд╛рдереЗ рдореЗрдВ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИред рдЪреВрдВрдХрд┐ рдХреЗрд╡рд▓ рд╕рдВрдХреЗрдд рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ (рдЕрд░реНрдерд╛рдд, рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рдВрдХреЗрдд рдЕрдВрдХ рдХреЗ рдмрд┐рдЯ рдХрд╛ рдореВрд▓реНрдп), рдЙрддреНрдкрд╛рдж рдХрд╛ рд╕рдВрдХреЗрдд рдП рдФрд░ рдмреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рд░ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ x b b рдХреЛ 31 рдмрд┐рдЯреНрд╕ (рдХреЗрд╡рд▓ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЕрдВрдХ рдЫреЛрдбрд╝рдХрд░) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЛрдгрд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ 0 рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ 1 рдирдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВред рдЗрд╕ рдорд╛рди рдХреЛ рджреЛ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ, рдПрдХрддрд╛ рд╕реЗ рдШрдЯрд╛рдПрдВ рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП -1 рдФрд░ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рд▓рд┐рдП 1 рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
 int sign = 1-2*((unsigned)a^b)>>31); 
рдЕрдм рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ a рдФрд░ b ред рдПрдХ рд╕рдорд╛рди рд╡рд┐рдзрд┐ рд╕реЗ, рд╣рдо рд╕рдВрдХреЗрдд рдЧреБрдгрд╛рдВрдХ a рдФрд░ b рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ:
 int c; c = 1-2*(((unsigned)a)>>31); a *= c; c = 1-2*(((unsigned)b)>>31); b *= c; 
рд╣рдо рдиреНрдпреВрдирддрдо рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдП рдФрд░ рдмреА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдХреА рдЧрдгрдирд╛ рдЙрдирдХреЗ рдЕрдВрддрд░ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
 int numbers[2], min; numbers[0] = b; numbers[1] = a; a -= b; c = (unsigned(a))>>31; min = numbers[c]; 
рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдЕрдЧрд▓рд╛ рдХрд╛рд░реНрдп
 static inline int LLR_2(int a, int b) { int sign, numbers[2]; sign = 1-2*(((unsigned)a^b)>>31); a *= 1-2*(((unsigned)a)>>31); b *= 1-2*(((unsigned)b)>>31); numbers[0] = b; numbers[1] = a; a -= b; return sign*numbers[((unsigned)a)>>31]; } 


LLR_2 рдХреЗ рд╕рд╛рде LLR () рдХреЙрд▓ рдмрджрд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдЕрдм рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдореЗрдВ рдПрдХ рднреА рд╕рд╢рд░реНрдд рдХреВрдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░реНрдгрд╛рдВрдХ рдЧреБрдгрди imul рдХреЗ рд▓рд┐рдП рддреАрди рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ (рдЧреБрдгрдХ 2 рд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдЦреБрдж рдПрдХ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд╣реИ)ред рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ - рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп 9.4 рд╕реЗрдХрдВрдб рд╣реИ! рдХреБрд▓ рдореЗрдВ, рд╡рд╛рдВрдЫрд┐рдд рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд╢рдГ "рд╢реБрджреНрдз" рд╕рдордп (2.1 рдФрд░ 0.2 рд╕реЗрдХрдВрдб) рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдСрдкрд░реЗрд╢рди рдХреА рдЧрддрд┐ рдореЗрдВ рджрд╕ рдЧреБрдирд╛ * рд╡реГрджреНрдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдЪрд▓рд┐рдП рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ рдЙрд▓рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдгрд╛рдВрдХ рдЧреБрдгрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реАрдзреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреИрди рдХреЗ рдорд╛рдкрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
 unsigned int mask[] = {0,(unsigned)-1}; unsigned int constant[] = {0, 1}; int c = ((unsigned)a)>>31; a = a^mask[c]+constant[c]; 
рдЕрдВрдд рдореЗрдВ, рд╣рдо рджрд╛рдПрдВ рдмрджрд▓рд╛рд╡ рдХреЛ _rotl () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдПрдХрд▓ рдЪрдХреНрд░реАрдп рдмрд╛рдИрдВ рдкрд╛рд░реА рдХреЗ рд╕рд╛рде 31 рдмрд┐рдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реАрдзреЗ рдЕрдкрдиреЗ рдХреЙрд▓ рдХреЛ рдПрдХ рд░реЛрдПрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдлрд┐рд░ рд╕реЗ рдПрдХ рд╕рд╛рде рд▓рд╛рдирд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк
 static unsigned int mask[] = {0,(unsigned)-1}; static unsigned int constant[] = {0, 1}; static inline int LLR_3(int a, int b) { int sign,c, numbers[2]; sign = (_rotl(a^b,1) & 1); c = ((_rotl(a,1) & 1)); a = (a^mask[c])+constant[c]; c = ((_rotl(b,1) & 1)); b = (b^mask[c])+constant[c]; numbers[0] = b; numbers[1] = a; c = ((_rotl(ab,1) & 1)); return (numbers[c]^mask[sign])+constant[sign]; } 


рд╣рдо LLR_3 () рдХреЗ рд╕рд╛рде LLR () _ 2 рдХреЙрд▓ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реГрджреНрдзрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рд░рдирдЯрд╛рдЗрдо рд▓рдЧрднрдЧ 9.4 рд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рджрд┐рд╢рд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рд╣реИ)ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЗрдореБрд▓ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдмрд╣реБрдд рддреЗрдЬ рд╣реИ!

рдЖрдЗрдП рдЙрд╕ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдЬрд┐рд╕рдиреЗ рдпрд╣ рд╕рдм рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ред рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрд┐рдд рдЕрдиреБрдХреВрд▓рди рдПрдХрд▓ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рдХреЛ 160 рд╕реЗ 140 рд╕реЗрдХрдВрдб (рдЬрдм i7 рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдЬреЛ 10% рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдЖрдЧреЗ рдХреБрдЫ рдФрд░ рдРрд╕реА рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ ...

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЕрдзрд┐рдХрддрдо рджреЛ рдкреВрд░реНрдгрд╛рдВрдХ 32-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЕрдХрд╛рджрдорд┐рдХ рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдиреАрдЪреЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╢рд░реНрдд рдХреВрдж рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдХрд▓реНрдк рдорд╛рдирдХ __max () рдореИрдХреНрд░реЛ (рдЬрдм i7 рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ рддреАрди рдЧреБрдирд╛ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рд╕реМрднрд╛рдЧреНрдп!
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 static inline int max(int a, int b) { int numbers[2][2]; numbers[0][0] = b; numbers[0][1] = a; numbers[1][0] = a; numbers[1][1] = b; int sign_a = (unsigned)a>>31; int sign_b = (unsigned)b>>31; int sign_ab = (unsigned)(a^b)>>31; int abs_a = (1-2*sign_a)*a; int abs_b = (1-2*sign_b)*b; int sign_a_b = (unsigned)(abs_a-abs_b)>>31; int c0 = sign_ab; int c1 = ((1^(sign_a_b)^(sign_a | sign_b)) & (1^c0)) | (sign_ab & sign_a); int result = numbers[c0][c1]; return result; } 



* рдпреВрдкреАрдбреАред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╢реЛрдбрд╛рди рдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рд░реИрдВрдб () рдХреЛ рд╕рдордп рдХреА рдЧрд┐рдирддреА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рд╕рд░рдгреА рд╕реЗ рдкрдврд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╡реГрджреНрдзрд┐ рд▓рдЧрднрдЧ рддреАрди рдЧреБрдирд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдпрд╣ рд╕рд░рдгреА рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддреЗ рд╕рдордп рдХрдиреНрд╡реЗрдпрд░ рдХреЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХрд╛рд░рдг рд╣реИред

Source: https://habr.com/ru/post/In180085/


All Articles