EliteHackers
SALUT 2022!!
NE-AM MUTAT PE DISCORD !
Vrei să inviți un prieten?
[T]eoria [H]aosului [C]ontrolat - https://discord.com/invite/U4HBCHzm7r
Acesta aste link-ul oficial al acestui server.
|
Lista Forumurilor Pe Tematici
|
EliteHackers | Reguli | Inregistrare | Login
POZE ELITEHACKERS
Nu sunteti logat.
|
Nou pe simpatie: Kitana Profile
| Femeie 25 ani Bucuresti cauta Barbat 25 - 48 ani |
|
luyzette
EliteHackers Diamond
Inregistrat: acum 16 ani
Postari: 117
|
|
care va fi automat evaluat si inlocuit de compilator (deci fara nici o implicatie asupra rularii programului) cu valoarea in baza 10:3 Codul care face posibil asa ceva:
/* * determinam la inceput cel mai mare integer care poate fi * descris (atomic) pe o masina, pt a beneficia de cele mai * multe lungi secvente de cifre pe o masina de 32 biti: * 'long'(dword din asm) de maxim 10 cifre pe masini x86 * 'long long' de maxim 19 cifre pe masini x64 * (long long exista si pe masina de 32 biti, dar va * fi simulat sau truncat) */ typedef long long longest_t;
/* * clasa template, specializata numai pentru longest_t * tot secretul aici este valoarea elementului 'value' din * enum, care nu e precizat direct ci lasat sa fie evaluat * prin recursivarea in alte instante ale clase template, * adica numarul nostru 'deghizat' in binar (el fiind tot * scris in decimal), va fi impartit pana la epuizare la * 10, retinand resturile impartirii (adica izoland cifra * cu cifra) apoi reinmultind cu 2 pt a schimba baza. */ template<longest_t N> class bin { public: enum { value = (N % 10) + (bin<N/10>::value << 1) }; };
/* * ne vom opri la ultima cifra, pt a ingadui incheierea * lantului recursivitatii si 'reimpachetarea' stivei * acest lucru este posibil datorita specializarii (adica * tratarii separate a) template-ului pt. cazul cand * numarul devine 2 (acest lucru e 'fortat' de noi mai * jos...) */ class bin<2> { public: enum { value = 0 }; };
Desi template-urile au realizat toata treaba pentru noi si sunt instrumente perfecte aici, operand numai in timpul compilarii, vom apela totusi la fratii lor 'vitregi': macrocomenzile, din doua motive: # 1. e destul de ciudat a scrie bin<10>::value de fiecare cand vrem numarul 2 scris in binar # 2. dupa cum am spus in introducere octalul ne poate juca feste, asa ca vom prefixa invizibil un 2 in fata oricui numar in noua baza, pt a inlatura orice confuzii si pt a avea si un mecanism simplu de stop.
Macro-ul este:
#define binary(n) bin<2##n>::value
De notat aici operatorul ## al preprocesorului, care lipeste direct doi operanzi sau paramatri (din a##b va rezulta ab).
Cu toate acestea puse la punct, nimeni nu ne mai opreste sa scriem de acum incolo:
binary(11) = binary(011) = binary(000000000000000011) pentru 3 binary(11111111) pentru 255 binary(100000000000000000) pentru 131072 binary(111111111111111111) pentru 262143 (maximumul in binar pe un sistem pe 32biti)
Sper sa va placa micul truc si folositi-l pe oriunde aveti ocazia sau nevoia! Ca o nota in plus, pe acest mecanism al utilizarii templaturilor si faptul ca ele sunt evaluate de catre compilator printr-o 'pseudoexecutie', numeroase alte programe interesante se pot realiza: numarare de biti, mini calculatoare pt. constante, etc. O nota de inspiratie personala a fost vizualizarea unui mini compilator de LISP realizat numai in template metaprogramming (exact ce am utilizat mai sus)!
_______________________________________
|
|
pus acum 16 ani |
|