www.Hacking-Romania.com
Hacking, gaby hacker team, programe hack, radmin hack, hi5 hack, hack the west, hacking romania, hacking stuff, hacking tools, 1 hack, 1st hacks, 2 hack, 2 hacks, 3 hack, 3 hacks, 3000 hack, 3004 hack, 4 hack, 4 hacks, 55 hack, 6 hack, 6 hacks, 7 hack, 7 hacks, 9 hack, 9dragons hack, a hack, adventure quest hack, aim hack, alz hack, and hacks, best hack, blue hack, bots hack, bots hacks, buy hack, cabal online hack, chaos hacks, cheat engine hack, cheat hack, cheats and hacks, cheats hacks, city hack, club hack, combo hack, conquer hacks, conquer online hack, conquer online hacks, conquer speed hack, conquiztador hack, counter strike 1.6 hack, damage hack, de hack, download hack, download hack for, dragonfable hack, dragonfable hacks, drakkarious hack, exp hack, flyff hack, free hack, free hacks, game hack, game hacks, garena exp hack, gladiatus hack, gm hack, gold hack, gunz hack, hack, hack 5, hack a pc, hack a site, hack a website, hack blog, hack conquer, hack counter strike, hack crack, hack cs, hack cs 1.6, hack dvd, hack email, hack forum, hack hunter, hack id, hack info, hack it, hack mess, hack muonline, hack net, hack password, hack passwords, hack pc, hack pdf, hack programs, hack site, hack sites, hack soft, hack software, hack team, hack the game, hack this, hack website, hack windows xp, hack world, hack xp, hacked, hacking, hacking game, hacking programs, hacking software, hacking tutorials, hacks, how hack, how to hack, icon hack, last chaos hack, last chaos hacks, life hack, lineage 2 hack, lineage 2 hacks, linux hack, lvl hack, maplestory hacks, mobile hack, multi hack 3.0, mybrute hack, naruto arena hack, naruto arena hacks, one hit kill hack, online hacks, perfect world hacks, pool hack, programe hack, resolution hack, resource hack, roll hack, royal hack, silkroad hack, source hack, speed hack, speed hacks, super hack, the west hack, warrock hack, warrock hacks, web hack, xpango hack, lockerz forum
Lista Forumurilor Pe Tematici
www.Hacking-Romania.com | Reguli | Inregistrare | Login

POZE WWW.HACKING-ROMANIA.COM

Nu sunteti logat.
Nou pe simpatie:
Angelina20 la Simpatie.ro
Femeie
19 ani
Cluj
cauta Barbat
24 - 55 ani
www.Hacking-Romania.com / Tutoriale Hack RO / Constante Binare in C++  
Autor
Mesaj Pagini: 1
mysticgohan
Pe lista neagra

Inregistrat: acum 16 ani
Postari: 1084
C++ ca limbaj de programare, suporta 3 baze de numaratie: normalul decimal, folositorul hexadecimal si total inutilul si eventual creatorul de probleme octal. Ma refer aici la conventia de scriere a unui numar in octal: orice numar incepand cu cifra 0. De aici confuzii de genul 0033 fiind de fapt 27 si nu 33 prefixat cu 0-uri pt. frumusete sau stil

Ca o paranteza curioasa, numerele de genul 08, 09 sunt total ilegale in C/C++, deoarece evident octul are cifre numai de la 0 la 7. Incercati de exemplu
int i = 08;

in orice compilator si urmariti efectul!

C/C++ fiind limbaje de nivel mediu, operand cu concepte per masina: pointeri, sizeof(), etc, ar fi trebuit sa contina si posibilitatea de a scrie numere direct in baza 2 (in binar) care de mult ori ar fi fost de dorit decat blamatul octal. Cei care lucreaza des cu operatii pe biti, cred ca ar fi apreciat cel mai mult o atare functionalitate.
Exista compilatoare care suporta numere introduse direct in baza binar, de exemplu GCC, dar mult de preferat ar fi fost o standardizare.
Bineinteles ca se pot scrie functii specializate pentru asa ceva (conversie din/in binar) cand este nevoie, dar cum orice programator de C/C++ stie, o functie inseamna extra timp la rulare, chiar daca in ziua de azi e de ordinul mili/nanosecundelor. Deci inca odata, o solutie din compilator ar fi perfecta!

Desi C++ nu ofera asa ceva, ofera in schimb suportul pentru a construi asa ceva...
Ma refer aici la template-uri si mecanismul de specializare a acestora. Prin utilizarea unei clase template specializata pe int, se pot realiza in C++ constructii in baza 2, care vor fi evaluate de compilator automat drept simple numere in baza 10!
De examplu putem avea ceva de genul:

binar<11>::valoare

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)!

credits: it-zone


pus acum 16 ani
   
Pagini: 1  

Mergi la