Shortcut & Serega
ΠΡΠΈΠ²Π΅Ρ, Π‘ΡΡΠ΅Π»Π°, ΡΠ»ΡΡΠ°Π», ΡΡ Π·Π° ΡΠ΅ΠΊΠΎΡΠ΄Ρ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ ΠΊΠ°ΡΡΠ΅ Π³ΠΎΠ½ΡΠ΅ΡΡΡΡ. ΠΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡΠ΄Ρ Π·Π°Π΄ΡΠΌΡΠ²Π°Π»ΡΡ, ΡΡΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΡΠ°ΠΉΠΌΠΈΠ½Π³Π° ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΈ ΠΊ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠ΄Π°? Π― ΡΡΡ ΠΏΠΎΠΈΠ³ΡΠ°Π»ΡΡ Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ, ΠΈ ΠΎΠ½ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΠ»ΡΡΠ°ΡΡ
Π±ΡΡΡΡΠ΅Π΅ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΌΠ΅Π½ΡΠ°Π»ΠΈΡΠ΅Ρ ΡΠΏΠΈΠ΄ΡΠ°Π½Π½Π΅ΡΠ° Π²ΡΠ»ΠΎΠ²ΠΈΡΡ ΠΊΠ°ΠΊΡΡ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΌΠΈΠΊΡΠΎ-ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π΄Π°ΠΆΠ΅ ΠΎΠΏΡΡΠ½ΡΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΡ.
ΠΠ°, ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΠ΅ΠΊΡΠ½Π΄Π° Π½Π° ΡΡΠ΅ΡΡ Π²Π΅Π·Π΄Π΅. ΠΠ°ΠΏΡΡΡΠΈ ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²ΡΠΈΠΊ, ΠΏΡΠΎΠ²Π΅ΡΡ Π½Π° Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·Π°Π½ΠΈΡ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠΉ, ΠΈ ΡΠ΄Π΅Π»Π°ΠΉ Π³ΠΎΡΡΡΠΈΠ΅ ΠΏΡΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΡΡΠΌΡΠΌΠΈ. ΠΡΠ»ΠΈ Π½Π°ΠΉΠ΄ΡΡΡ ΠΊΡΠΎΡΠ΅ΡΠ½ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ±ΡΠ°ΡΡ β ΡΡΠΎ ΡΠΆΠ΅ ΠΏΠΎΠ±Π΅Π΄Π°. ΠΠΎΠΊΠ°ΠΆΠΈ ΠΌΠ½Π΅ ΠΌΠΈΠΊΡΠΎΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π΄Π°ΠΆΠ΅ ΠΏΡΠΎΡΠΈ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΠ»ΠΈ β Π²ΡΠ·ΠΎΠ² ΠΏΡΠΈΠ½ΡΡ.
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π²ΠΎΡ ΠΊΡΡΠΎΡΠ΅ΠΊ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ°Π΅Ρ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΡΠΊ Ρ Π±ΠΈΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΊΠΎΠΉ. Π― ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π» Ρ
Π²ΠΎΡΡΠΎΠ²ΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π»Π° Π² ΡΠΈΠΊΠ» ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠ»ΠΎΠ²Π½ΠΎΠ³ΠΎ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ°ΡΠΊΡ. ΠΠΎΠ΄ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
```c++
int fact(int n){
int res=1;
while(n>1){
int mask = -(n & 1); // Π²ΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΡ, Π΅ΡΠ»ΠΈ Π½Π΅ΡΠ΅ΡΠ½ΠΎΠ΅, Π½ΡΠ»ΠΈ, Π΅ΡΠ»ΠΈ ΡΠ΅ΡΠ½ΠΎΠ΅
res *= (n & mask) | (~mask & 1);
n--;
}
return res;
}
```
ΠΡΠΎΡ ΡΡΡΠΊ Ρ `mask` ΡΠ±ΠΈΡΠ°Π΅Ρ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠ΅ `if (n%2)`, ΡΠ°ΠΊ ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ Β«Π·Π°Π²ΠΈΡΠ°ΡΡΒ» ΠΈΠ·-Π·Π° Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·Π°Π½ΠΈΡ. Π― ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²Π°Π» Π΅Π³ΠΎ Π½Π° ΡΠ²Π΅ΠΆΠ΅ΠΌ Intel Core ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΎΡΠ΅Π½ ΡΠΈΠΊΠ»ΠΎΠ² Π½Π° Π²ΡΠ·ΠΎΠ² ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΎΠ±ΡΡΠ½ΡΠΌ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ. ΠΡΠ»ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Π΅Π³ΠΎ ΡΠ΅ΡΠ΅Π· `perf` ΠΈΠ»ΠΈ `gprof`, ΡΠ²ΠΈΠ΄ΠΈΡΡ, ΠΊΠ°ΠΊ ΠΏΡΡΡ Π±Π΅Π· Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠΉ Π΄ΠΎΠΌΠΈΠ½ΠΈΡΡΠ΅Ρ Π² Π³ΠΎΡΡΡΠ΅ΠΌ ΡΠΈΠΊΠ»Π΅. Π‘ΠΎΠΎΠ±ΡΠΈ, ΡΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²ΡΠΈΠΊ β Π΅ΡΠ»ΠΈ ΡΠΌΠΎΠ³Ρ Π²ΡΠΆΠ°ΡΡ Π΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅, ΠΎΡΠΏΡΠ°Π²Π»Ρ ΡΠ»Π΅Π΄ΡΡΡΡΡ Π²Π΅ΡΡΠΈΡ.