hexadecimalt tal till sträng
hexadecimalt tal till sträng
Hallå!
jag vill skriva en egen funktion som tar en t.ex char eller int och så att man får ut talet som en sträng.
ex inparameter 0xAA
resultat: "170"
jag har för mig att jag en gång gjorde en sådan funktion i VHDL i skolan men glömt hur själva algorithmen fungerar. Någon som kommer ihåg eller kan hitta en länk till hur man gör? Har letat ett tag nu men inte hittat.
jag vill skriva en egen funktion som tar en t.ex char eller int och så att man får ut talet som en sträng.
ex inparameter 0xAA
resultat: "170"
jag har för mig att jag en gång gjorde en sådan funktion i VHDL i skolan men glömt hur själva algorithmen fungerar. Någon som kommer ihåg eller kan hitta en länk till hur man gör? Har letat ett tag nu men inte hittat.
En algoritm som jag tycker är intressant ser ut så här, den går att utöka till hur stora tal som helst.
Flytta alla bitarna åt vänster i dessa byte:
Bcd0, Bcd1, Bcd2, Bin1, Bin0
Addera $3 till Bcd2 och spara värdet om bit 3=1.
Addera $30 till Bcd2 och spara värdet om bit 7=1.
Addera $3 till Bcd1 och spara värdet om bit 3=1.
Addera $30 till Bcd1 och spara värdet om bit 7=1.
Addera $3 till Bcd0 och spara värdet om bit 3=1.
Addera $30 till Bcd0 och spara värdet om bit 7=1.
Upprepa allt detta 15 gånger(totalt 15 gånger alltså) och avsluta med att flytta bitarna åt vänster en sista gång.
Om talet är 12345 (Bin0=$39 Bin1=$30) så blir resultatet Bcd0=$01 Bcd1=$23 Bcd2=$45
Flytta alla bitarna åt vänster i dessa byte:
Bcd0, Bcd1, Bcd2, Bin1, Bin0
Addera $3 till Bcd2 och spara värdet om bit 3=1.
Addera $30 till Bcd2 och spara värdet om bit 7=1.
Addera $3 till Bcd1 och spara värdet om bit 3=1.
Addera $30 till Bcd1 och spara värdet om bit 7=1.
Addera $3 till Bcd0 och spara värdet om bit 3=1.
Addera $30 till Bcd0 och spara värdet om bit 7=1.
Upprepa allt detta 15 gånger(totalt 15 gånger alltså) och avsluta med att flytta bitarna åt vänster en sista gång.
Om talet är 12345 (Bin0=$39 Bin1=$30) så blir resultatet Bcd0=$01 Bcd1=$23 Bcd2=$45
Senast redigerad av Chribbe76 27 augusti 2007, 22:23:52, redigerad totalt 1 gång.
>>chribbe76 Det var en sån algorithm jag var ute efter! Men jag förstår inte riktigt hur den fungerar trots din förklaring.
Hur menar du med att flytta alla bitarna åt vänster i dessa byte??
jag förstår inte riktigt placeringen av bytsen, låt säga att jag har ett 16 bitars tal jag vill konvertera, måste jag placera strängen först och därefter 16 bitars talet?.
bit 3 och bit 7, börjar du räkna från bit0?
tänkte köra ett litet exempel.
talet 0b1000 (talet
;
bit 3 == 1;
b01000 + 0b11 = 0b1011
bit 7 == 0;
gör inget
bit 3 == 1;
0b1011+0b11 = 0b1110
bit 7 == 0;
gör inget
bit 3 == 1;
0b1110+0b11 = 0b10001
bit 7 ==0
gör inget
bit 3 == 0
gör inget.
bit 7 == 0
gör inget.
Det känns som det är massor jag missat
Hur menar du med att flytta alla bitarna åt vänster i dessa byte??
jag förstår inte riktigt placeringen av bytsen, låt säga att jag har ett 16 bitars tal jag vill konvertera, måste jag placera strängen först och därefter 16 bitars talet?.
bit 3 och bit 7, börjar du räkna från bit0?
tänkte köra ett litet exempel.
talet 0b1000 (talet

bit 3 == 1;
b01000 + 0b11 = 0b1011
bit 7 == 0;
gör inget
bit 3 == 1;
0b1011+0b11 = 0b1110
bit 7 == 0;
gör inget
bit 3 == 1;
0b1110+0b11 = 0b10001
bit 7 ==0
gör inget
bit 3 == 0
gör inget.
bit 7 == 0
gör inget.
Det känns som det är massor jag missat
Man ska börja med att nollställa Bcd0, Bcd1, Bcd2.
När man flyttar bitarna ett steg ska man flytta genom hela kedjan Bcd0, Bcd1, Bcd2, Bin1, Bin0.
Exempel: [Bin0 Bit7] flyttas till [Bin1 Bit0] och [Bin1 Bit7] flyttas till [Bcd2 Bit0].
för ett 16-bitars tal ska allt (inklusive att flytta bitarna) upprepas 15 gånger.
Det kanske går att upprepa 16 gånger så att man slipper flytta bitarna ytterligare en gång efter loopen, men jag är inte säker på det.
Det blir nog ganska jobbigt att testa genom att räkna manuellt, prova att skriva ett program som gör det istället.
Jag är nog inte så bra på att förklara så det är helt naturligt om du inte förstår.
Fråga på bara om du undrar något.
När man flyttar bitarna ett steg ska man flytta genom hela kedjan Bcd0, Bcd1, Bcd2, Bin1, Bin0.
Exempel: [Bin0 Bit7] flyttas till [Bin1 Bit0] och [Bin1 Bit7] flyttas till [Bcd2 Bit0].
för ett 16-bitars tal ska allt (inklusive att flytta bitarna) upprepas 15 gånger.
Det kanske går att upprepa 16 gånger så att man slipper flytta bitarna ytterligare en gång efter loopen, men jag är inte säker på det.
Det blir nog ganska jobbigt att testa genom att räkna manuellt, prova att skriva ett program som gör det istället.
Jag är nog inte så bra på att förklara så det är helt naturligt om du inte förstår.
Fråga på bara om du undrar något.
Vet inte om jag förstår frågan, men chansar.
Är det något i stil med följande du är ute efter: http://www.dattalo.com/technical/software/pic/bcd.txt
Att sen konvertera från BCD till sträng är ju en smal sak.
En bra printf-implementation att sno från det man behöver finns här: http://www.and.org/texts/simple_printf.c
Är det något i stil med följande du är ute efter: http://www.dattalo.com/technical/software/pic/bcd.txt
Att sen konvertera från BCD till sträng är ju en smal sak.
En bra printf-implementation att sno från det man behöver finns här: http://www.and.org/texts/simple_printf.c
Följande VHDL kod använder jag i en testbänk. (Integer to String)
Kod: Markera allt
function ToString(val : integer) return string is
variable last : integer;
variable digit : integer;
variable tmp : integer := abs(val);
variable pos : integer := 1;
variable buf : string(80 downto 1);
begin
loop
digit := abs(tmp mod 10); -- MOD of integer'left returns neg number!
tmp := tmp / 10;
buf(pos) := character'val(character'pos('0') + digit);
pos := pos + 1;
exit when tmp = 0;
end loop;
if val < 0 then
buf(pos) := '-';
pos := pos + 1;
end if;
pos := pos - 1;
return buf(pos downto 1);
end ToString; -- function
Satt med ett liknande problem på jobbet idag men kom fram till att sprintf() var nog så optimerad redan.Ett par länkar till på samma ämne:
ADD3-algoritmen (dela upp en u8 till ental, tiotal, hundratal) Går aldeles säkert att utöka till u16:
http://www.tfe.umu.se/courses/dator/Dat ... BinBCD.htm
GCC C/C++ implementationer av itoa()
http://www.jb.man.ac.uk/~slowe/cpp/itoa.html
ADD3-algoritmen (dela upp en u8 till ental, tiotal, hundratal) Går aldeles säkert att utöka till u16:
http://www.tfe.umu.se/courses/dator/Dat ... BinBCD.htm
GCC C/C++ implementationer av itoa()
http://www.jb.man.ac.uk/~slowe/cpp/itoa.html