ZX Spectrum > PROGRAMOWANIE

Konwerter HEX to BIN i odwrotność

<< < (3/6) > >>

Phonex:
Serio? Pomocy? Przecież konwersja liczby binarnej do dziesiętnej to zadanie dla pierwszej klasy informatyki.
Da się to napisać przy porannej kawie.
Algorytm bezpośrednio wynika z konstrukcji liczby binarnej.

Mamy liczbę binarną B: B7B6B5B4B3B2B1B0
DEC=B7*27+B6*26+B5*25+B4*24+B3*23+B2*22+B1*21+B0*20
A w Basic

--- Kod: ---LET dec=2^7*b(1)+2^6*b(2)+2^5*b(3)+2^4*b(4)+2^3*b(5)+2^2*b(6)+2^1*b(7)+2^0*b(8)

--- Koniec kodu ---
Dla liczby binarnej w zmiennej łańcuchowej b$:

--- Kod: ---LET dec=2^7*VAL b$(1)+2^6*VAL b$(2)+2^5*VAL b$(3)+2^4*VAL b$(4)+2^3*VAL b$(5)+2^2*VAL b$(6)+2^1*VAL b$(7)+2^0*VAL b$(8)

--- Koniec kodu ---

Albo elegancko w pętli

--- Kod: ---LET dec=0
FOR a=1 TO 8
LET dec=dec+2^(8-a)*VAL b$(a)
NEXT a

--- Koniec kodu ---
Można to zrobić na pierwotnej nie-odwróconej liczbie binarnej wystarczy odwrócić ją "w biegu", czyli zmieniać indeks od końca do początku.

--- Kod: ---LET dec=0
FOR a=1 TO 8
LET dec=dec+2^(8-a)*VAL b$(9-a)
NEXT a

--- Koniec kodu ---

Tylko po co zamieniać na dziesiętną? Można od razu na HEX.
To już poważniejsza sprawa, zajmuje aż 10 minut.

--- Kod: ---10 LET h$=""
20 LET start=1: GO SUB 1000
30 LET start=5: GO SUB 1000
40 STOP: REM wynik w h$

1000 LET h=0
1010 FOR a=0 TO 3
1020 LET h=h+2^(3-a)*VAL b$(a+start)
1030 NEXT a
1040 IF h>9 THEN LET h=h+(CODE "A"-CODE "9"-1)
1050 LET h$=h$+CHR$ (h+CODE "0")
1060 RETURN

--- Koniec kodu ---
Pętla oblicza wartość dziesiętną połówki bajta, dwie następne linie tworzą hex.
Oczywiście zamiast CODE "coś-tam" można wpisać stałe - będzie szybciej.

Także w tym przypadku można działać na nie-odwórconej liczbie binarnej:

--- Kod: ---10 LET h$=""
20 LET start=5: GO SUB 1000
30 LET start=1: GO SUB 1000
40 STOP: REM wynik w h$

1000 LET h=0
1010 FOR a=0 TO 3
1020 LET h=h+2^(3-a)*VAL b$(3-a+start)
1030 NEXT a
1040 IF h>9 THEN LET h=h+(CODE "A"-CODE "9"-1)
1050 LET h$=h$+CHR$ (h+CODE "0")
1060 RETURN

--- Koniec kodu ---

Gelip:

--- Cytat: Phonex w 2021.11.10, 09:08:26 ---Serio? Pomocy? Przecież konwersja liczby binarnej do dziesiętnej to zadanie dla pierwszej klasy informatyki.
Da się to napisać przy porannej kawie.
--- Koniec cytatu ---
Wiem, wiem ale ostatnio jestem bardzo zmęczony i nic mi się nie chce. Mimo tego już rozwiązałem problem - wystarczy tylko połączyć wszystko w jeden program. Zrobiłem konwersję z bin na dec, odwrotność bin i znowu na dec tak jak w pliku decbinrevdec.z80

Ale oczywiście dzięki za Twój kod - sprawdzę tylko nie wiem kiedy.

Phonex:
Luzik. W takim razie - "happy to help" cytując całkiem świeży film SF :)

Gelip:
@Phonex
Sprawdziłem Twoje programy i ładnie konwertują BIN na HEX. A jak w odwrotną stronę czyli HEX na BIN?

Phonex:
Trudne: 25 minut ;)
Albo to przez to, że dziś dzień wolny...

--- Kod: ---100 REM liczba HEX w x$, tylko duże litery
110 LET n$=""
120 LET s=CODE x$(1): GO SUB 2000
130 LET s=CODE x$(2): GO SUB 2000
140 STOP: REM wynik w n$
 
2000 IF s>CODE "9" THEN LET s=s-(CODE "A"-CODE "9"-1)
2010 LET s=s-CODE "0"
2020 FOR a=3 TO 0 STEP -1
2030 LET s$="0"
2040 LET b=INT s/(2^a)
2050 IF b THEN LET s$="1": LET s=s-b*2^a
2060 LET n$=n$+s$
2070 NEXT a
2080 RETURN

--- Koniec kodu ---

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

[*] Poprzednia strona

Idź do wersji pełnej