hexadecimalt tal till sträng

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

ADD3-algoritmen som oJsan länkade till är samma som jag beskrev.
I deras fall adderas talen med 3 om talen är >=5, men i mitt fall adderas talen med 3 och om bit 3 är satt(vilket betyder >=8 ) så sparas värdet.

Jag förstår verkligen inte varför det fungerar. :wall:
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Det är faktiskt inte så krångligt som du tror.

Ett sätt att omvandla ett 4bitars tal är att "låta" den slå över när talet är större än 10, genom att addera 6 (16-10 basen)

exempel:

Kod: Markera allt

bin		=> BCD
b0000		=> b0000 0000	,0 0
b0001		=> b0000 0001	,0 1
b0010		=> b0000 0010	,0 2
b0011		=> b0000 0011	,0 3
b0100		=> b0000 0100	,0 4
b0101		=> b0000 0101	,0 5
b0110		=> b0000 0110	,0 6
b0111		=> b0000 0111	,0 7
b1000		=> b0000 1000	,0 8
b1001		=> b0000 1001	,0 9
b1010 + b0110	=> b0001 0000	,1 0
b1011 + b0110	=> b0001 0001	,1 1
b1100 + b0110	=> b0001 0010	,1 2
b1101 + b0110	=> b0001 0011	,1 3
b1110 + b0110	=> b0001 0100	,1 4
b1111 + b0110	=> b0001 0101	,1 5
låt oss kolla på 9 och 10
b1001 + b0110 => b1111 ,"9" som du ser här "sätts" inte bit 4 när man addera 9 + 6 (vilket blir F hex)
vilket gör att man kan man kan testa om det är 10 eller högre genom att addera 6 och kolla bit 4.(vilket snabbt kollat på AVR,PIC mm)

Nu är inte så "roligt" att ha bit 4 att kolla på efter som den hamnar utan för "fyra" bitarna (skulle hamna i carry i en 4bit procesor)
Men det går att ganska enkelt att lösa, som du ser så påverkas inte "sista" vilket beror på att man har en gemensamma nämnare mellan de två baserna 10 och 16 nämligen 2
så man kan helt enkelt dela 2 först (en skiftning).

Det ger att man addera 3 istället och titta på bit 3, Det ger en "klar" fördel genom att man alldrig behöver kolla eller ta hänsyn till Carryn.

hoppas att det förklarade lite gran ^^
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Inlägg av persika »

Intressant med ADD3-algoritmen, undras om den går att köra "baklänges", för att kunna konvertera BCD -> binär ?
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Ja, kanske men troligt vis är den mindre "effektiv" mot andra algoritmer för omvandlingen BCD till bin.

Exempel:
varje bit i ett BCD kan mapas till ett värde vilket ger en bit test och en addition om den är sant.
Detta ger snabb omvandling med hyfsat lite kod. exempel "5st BCD" till ett 16bitar tal tar ca 65 instruktioner.

Detta kan jämföras med en ADD3 16bitar till BCD som tar 136 instruktioner + ret optimmerad (loop unrolling, samt lite annat)...
Användarvisningsbild
ucadv
Inlägg: 203
Blev medlem: 29 januari 2007, 23:13:49

Inlägg av ucadv »

varför krångla till det???

Kod: Markera allt

integer'image( mitt_tal );
integer'image( to_integer( min_unsigned) );
integer'image( conv_integer(min_std_logic_vector) );
Skriv svar