Konverzia bin na hex v pascale

Sekcia o programovaní, programovacích jazykoch...
Split
Používateľ
Používateľ
Príspevky: 321
Dátum registrácie: Pi 28. Júl, 2006, 02:00
Bydlisko: Komárno

Konverzia bin na hex v pascale

Príspevok od používateľa Split »

Nevie niekto kde by som nasiel proceduru alebo program ktory umozni prevod binarneho cisla na hexadecimalny format?konkretne na 8bitovy tvar napr. 1111 1111 na FF..napada ma iba rozdelit na dve stvorcislia a spravit to cez case ale to by bol velmi dlhy program
CPU:Sempron 2600+ 64bit Palermo, RAM:512 MB
Kingston, GPU:ASUS Radeon X550 256 MB RAM, MB: MSI K8N Neo3-F, DVD RW:LG GSA 4167-B, HDD:Hitachi 80GB,Maxtor 10GB Case:Mercury KM87 350W
Používateľov profilový obrázok
kami_sama
Používateľ
Používateľ
Príspevky: 362
Dátum registrácie: Po 05. Sep, 2005, 20:00
Bydlisko: Bratislava

Re: Konverzia bin na hex v pascale

Príspevok od používateľa kami_sama »

bin cislo je ako retazec, alebo cislo, alebo pole bitov, alebo ako reprezentovane?

hexa cislo treba vygenerovat ako? ako cislo, alebo print na obrazovku, ako text?

mne napada viac moznosti (sorry, pisem v jave, ale je jasny):

1. nech binarne cislo je reprezentovane ako pole bitov
a) urobis pole, ktore bude reprezentovat mocniny:
int [] mocniny = new int {128, 64, 32, 16, 8, 4, 2, 1};

b) binarne cislo je neako takto (napnene niekde inde)
int [] binarne = new int [8];

c) zistim cislo
int cislo = 0;
for (int i = 0; i < 8; i++)
if (binarne != 0)
cislo += mocniny ;

d) potom staci prepisat cislo na retazec v hexa forme (toto je trosku blbe riesenie, ale co uz...)
char prvyZnak; char druhyZnak;
char [] znaky = new znaky {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
prvyZnak = cislo / 16;
druhyZnak = cislo % 16;

e) a vypisat vysledok na obrazovku:
System.out.println (prvyZnak+druhyZnak);

- ked mas binarne cislo ako retazec, princip je taky isty. ked sa nemylim,
pascal dokaze pristupovat k retazcu ako keby bol pole znakov (co v podstate
aj je).

- ked binarne cislo mas ako samotne cislo, potom pomocou modula a
delenia sa daju ziskat aktualne mocniny 2ky pomerne jednoducho.
(hint:
1111 mod 10 == 1
1110 mod 10 == 0
1111 div 10 = 111
)

(btw: ostatne metody nenapisem. vygoogle, ked sa ti chce)
LittleMan
Používateľ
Používateľ
Príspevky: 810
Dátum registrácie: Pi 27. Máj, 2005, 20:00
Bydlisko: NR - okolie, Brno

Re: Konverzia bin na hex v pascale

Príspevok od používateľa LittleMan »

pripada mi zbytocne prevadzat to bin cislo do dec a az nasledne do hex ...

akurat som dnes na prednaske pocuval, ake je jednoduche prevadzat cisla priamo medzi bin, oct a hex, pretoze ich zaklady su vo vsetkych pripadoch 2^n (2^1, 2^3 a 2^4) ... co znamena, ze v oct sustave mozem jednym cislom zakodovat prave tolko moznosti, co v bin 3 bitmi ... analogicky v hex mozem jednou cislicou zakodovat tolko moznosti, co v bin 4 bitmi ...

takze staci ist z prava dolava, vzdy zobrat posledne 4 bity z toho bin cisla a prepisat ich na 1 cislicu hex ...

teda napr ak budu posledne 4 bity 1011 tak sa zapise B, ak budu 1111 tak F, pre 0001 to bude 1 ... tych 16 kombinaci hadam zvladnes vypisat :)

naco pocitacu komplikovat zivot dec sustavou, ked ju nativne neovlada a musi do nej iba prepocitavat ;-)
Life is short - enjoy it!
HP ProBook 6470b, 8GB RAM, SSD | Intel Pentium 4 2.80GHz, 2xKingston DDR 512MB, Intel D875PBZ, Radeon 9800XT, 3×SATA (600GB)
Používateľov profilový obrázok
kami_sama
Používateľ
Používateľ
Príspevky: 362
Dátum registrácie: Po 05. Sep, 2005, 20:00
Bydlisko: Bratislava

Re: Konverzia bin na hex v pascale

Príspevok od používateľa kami_sama »

mylis sa, neide o dec sustavu. ide o cislo.=;)

namiesto 16 kludne mozes napisat 10h. to je uz len detail.

dodatok: a namiesto mocnin 80h, 40h, 20h, 10h, 8h, 4h, 2h, 1h.
LittleMan
Používateľ
Používateľ
Príspevky: 810
Dátum registrácie: Pi 27. Máj, 2005, 20:00
Bydlisko: NR - okolie, Brno

Re: Konverzia bin na hex v pascale

Príspevok od používateľa LittleMan »

ide o to, ze tvoj algoritmus s mocninami nie je univerzalny pre n-bitove binarne cislo, je stavany exaktne pre 8-bitove ... samozrejme, dal by sa upravit odstranenim pola mocnin s tym, ze by sa vzdy priamo v cykle vypocitala dana hodnota mocniny ... a^(n-i)

avsak stale pojde o cislo v dec sustave - pokial bin cislo rozpisem v tvare an*2^n+a(n-1)*2^(n-1) + ... + a1*2^1 + a0*2^0 tak po scitani dostanem jeho dec formu ...

nevravim ze je to zle riesenie, len som navrhol aj ine, ktore nepotrebuje prevod do dec sustavy bit po bite, ale vyuzije to, ze hex je bin^4 a bude to robit porovnavanim po 4 bitoch ...

a mojim laickym okom odhadujem, ze vypoctova zlozitost tohto algoritmu bude 1/4 oproti tvojmu, kedze nerobi ukon pre kazdy bit ale pre kazde 4 bity ... :) (naozaj iba laicky odhadujem, neviem to pocitat a ani nechcem vediet vysledok)
Life is short - enjoy it!
HP ProBook 6470b, 8GB RAM, SSD | Intel Pentium 4 2.80GHz, 2xKingston DDR 512MB, Intel D875PBZ, Radeon 9800XT, 3×SATA (600GB)
Používateľov profilový obrázok
kami_sama
Používateľ
Používateľ
Príspevky: 362
Dátum registrácie: Po 05. Sep, 2005, 20:00
Bydlisko: Bratislava

Re: Konverzia bin na hex v pascale

Príspevok od používateľa kami_sama »

je to sice super, ze prechadzas cez 4 bity, ale prejst cele binarne cislo po jednom budes musiet aj tak, ci tak. mocniny davat do pola vopred, alebo vypocitat on the fly je uz v podstate jedno. aj ked uz si pisal efektivnost, vypocitat mocniny je o dost narocnejsie, ako pristup rovno do pamate. (hovorime o procesorovom case a o pocte ciklov, ktore musi vykonat aby dokoncil danu operaciu).

nevidim vyznam, preco by si mal vypocitat jedno cislo, ktore je v binarnej forme do x dalsich. budes brat bity po jednom, ale ako to budes ulozit? po styroch bitoch? ci vypises len vzdy na obrazovku aktualnu cislicu, vynulujes a ides dalej? alebo to ulozis, ako jedno cislo a potom pomocou module dostanes jednotlive zlozky v hexa? ja by som bral tu poslednu moznost. dovod je asi jasny: ked potrebujem to cislo, je k dispozicii.

este raz napisem, ze cisla v pocitaci su reprezentovane, ako postupnost bitov (co iste vies). to, ze defaultne to vypisuje v dec, este nic neznamena.

ved x modulo 10h == prvy styri bity, (x div 10h)modulo10h dalsie styri, atd.
alebo ked chces byt este lepsi, mozes to robit aj pomocou bitovych presunov a operacii, a'la (kod zase z javy):
prva cislica = x & fh (alebo x & 15)
druha cislica = (x >> 4) & fh (alebo (x >> 4) & 15)
tretia cislica = (x >> 8) & fh ....
bitove presuny, ako aj bitove logicke operacie su realizovane za 1 cyklus procesora.

berem, mocniny davat do pola je blbost, ked chces viac univerzalnejsi nastroj. ale zatial nevidim ziadny vyznam, preco by si nemal vypocitat najprv to cislo, az potom riesit ostatne veci...
Používateľov profilový obrázok
pEpinko
Používateľ
Používateľ
Príspevky: 850
Dátum registrácie: Po 19. Máj, 2008, 09:31
Bydlisko: BA/NR

Re: Konverzia bin na hex v pascale

Príspevok od používateľa pEpinko »

Nerozumiem o com sa hadate autor threadu ani nedopovedal ako je binarne cislo kodovane (predpokladam to na retazec).

Potom ako najrozumnejsia metoda mi prijde: inicializujem si premennu B na 0, nacitam do premennej A hodnotu prveho znaku, odcitam '0', urobim shift right o 1 na premennej B a k B pripocitam hodnotu A. Nacitam do A hodnotu dalsieho znaku... Ked toto urobim s celym retazcom tak v B mam svoje binarne cislo. Prevod do hex je velmi jednoduchy bud zavolam nieco zo standartnej kniznice (v pascale tusim writeln, v C urcite printf a vo Win32 api je to wsprintf, alebo nejake zlozitejsie [bezpecnejsie] varianty; tam uvediem ako formatovaci znak x, pripadne X). Pripadne si urobim podobnu proceduru ako vyssie spominanu, akurat budem brat 4 bity a pricitavat k '0' resp. 'a' (ako kedy bude treba).

Inak dekadicka sustava nerobi procesorom (x86) az taky problem, existuje nieco ako BCD a instrukcie DAA, DAS ... .

A polia so znakmi a mocninami by som nerobil budu to zbytocne pristupy do pamete a to je drahe.

EDIT: pocitanie mocnin 2 je v podstate rychlejsie ako pristup do pamete.

mocnina:
mov eax, 1 ;do eax dame 1 - 1cpu cyklus
shl eax, C ;zrazu mame v eax 2^C - 1cpu cyklus

Dokopy 2 cpu cykly bez pouzitia pamete, teda sa nemusi dlhocizne cakat na pamet - co je ostatne hlavny zdroj cakania v sucasnych procesorov.
Naposledy upravil/-a pEpinko v Po 29. Sep, 2008, 21:22, upravené celkom 2 krát.
Používateľov profilový obrázok
kami_sama
Používateľ
Používateľ
Príspevky: 362
Dátum registrácie: Po 05. Sep, 2005, 20:00
Bydlisko: Bratislava

Re: Konverzia bin na hex v pascale

Príspevok od používateľa kami_sama »

ten shift je dobry, sa mi paci celkom.=:)

Návrat na "Programovanie"