Strona 1 z 1

Algorytm konwersji liczb binarnych na postać znakową

: niedziela 07 sty 2018, 10:59
autor: gaweł
Już dawno miałem zamiar opisania algorytmu konwersji liczb binarnych (dowolnej długości) na postać znakową. Algorytm ten polega na cyklicznej (tyle razy, ile bitów ma cała liczba) realizacji operacji przesunięcia o jeden bit i wykonania w pewnych przypadkach korekcji. Wszystkie operacje (sprawdzenie, czy konieczna jest korekcja oraz sama korekcja) są realizowane na 4-bitowych tetradach. Jeżeli 4-bitowa zawartość jest większa lub równa 5, to do tej tetrady należy dodać liczbę 3 (to jest ta wspomniana korekcja). Po wykonaniu wymaganej liczby operacji przesunięcia, wejściowa liczba jest zapisana w kodzie BCD, czyli każde 4 bity reprezentuje kolejne cyfry liczby. Do przejścia na postać znakową, do każdej tetrady należy dodać 30 hex (kod znaku '0').
Do ilustracji algorytmu napisałem odpowiedniego PDF'a, gdyż opisanie tego samego w poście jest upierdliwe (a może nawet niemożliwe). W PDF'ie wyszarzenie symbolizuje podział na 4-bitowe tetrady. Kolorem zielonym zaznaczyłem wsuwające się w wyniku przesunięcia zera.

Rozwiązanie to stosowałem również w układach FPGA do konwersji binarnych zawartości różnych rejestrów na postać znakową na wyświetlacz.

Załącznik ilustrujący algorytm:
bin to bcd-32bit.pdf

Re: Algorytm konwersji liczb binarnych na postać znakową

: poniedziałek 08 sty 2018, 21:41
autor: tasza
ooo, no to ja podziękowała za ten materiał...więcej w Motce zaraz

Re: Algorytm konwersji liczb binarnych na postać znakową

: wtorek 09 sty 2018, 13:18
autor: gaweł
tasza pisze:ooo, no to ja podziękowała za ten materiał...więcej w Motce zaraz

Przeczytałem materiał w opcjach księżniczki motorolki i cieszę się, że stał się kamieniem milowym na Twej drodze :D

Re: Algorytm konwersji liczb binarnych na postać znakową

: wtorek 09 sty 2018, 14:02
autor: gaweł
Algorytm jest pokłosiem arytmetyki BCD. W niektórych prockach występują specjalne instrukcje i wskaźniki przeznaczone do arytmetyki BCD. Przykładowo takie możliwości sprzętowe mają procki z rodziny C51.

Kod BCD (ang. Binary Coded Decimal czyli liczby dziesiętne zakodowane binarnie) pozwala zapisać w jednym bajcie dwucyfrową liczbę traktowaną w systemie dziesiętnym. Każda z cyfr zajmuje 4 bity. Wiadomo, że na 4 pozycjach bitowych można zapisać 16 różnych kombinacji, jednak w systemie dziesiętnym występuje 10 cyfr (jako cyfry od 0 do 9). Do zapisania każdej z cyfry dziesiętnej potrzeba również 4 bitów. Niewykorzystane kombinacje (cyfry od A hex do F hex) należy traktować jako nielegalne. Przykładowo zapisanie liczby 23 w kodzie BCD wygląda następująco:
bin2bcd_ilu20.PNG
Na starszej połówce mamy 0010 bin co odpowiada liczbie 2 dec, na dolnej połówce mamy 0011 bin co odpowiada 3 dec. Okazuje się, że na tak zapisanych liczbach można realizować operacje dodawania w tradycyjny sposób. Przykładowo:

Kod: Zaznacz cały

        00010001 = 11 BCD
+       00100010 = 22 BCD
-----------------------
        00110011 = 33 BCD
Realizując typową operację dodawania binarnego (instrukcja ADD) uzyskuje się praktycznie poprawny wynik. Ze względu na “niepełne” wykorzystanie kombinacji binarnych w kodzie BCD w pewnych sytuacjach pojawiają się problemy. Rozpatrzmy następujący przykład:

Kod: Zaznacz cały

        00010101 = 15 BCD
+       00010111 = 17 BCD
-----------------------
        00111100 = 2C bin
Ponieważ w wyniku dodawania binarnego pojawia się liczba spoza zakresu liczb BCD (C hex), należy dokonać drobnej korekty. W sytuacji, gdy na młodszej pozycji pojawiła się cyfra spoza zakresu, do powstałego wyniku należy dodać liczbę 06 hex (w przypadku, gdy podobna sytuacja dotyczy starszej liczby BCD, należy do powstałego wyniku dodać 60 hex).

Kod: Zaznacz cały

        00010101 = 15 BCD
+       00010111 = 17 BCD
-----------------------
        00101100 = 2C bin
+       00000110 = 06 bin
-----------------------
        00110010 = 32 BCD

W wyniku korekty powstał poprawny wynik (15 dec+17 dec=32 dec).
Rozpatrzmy jeszcze jeden przykład:

Kod: Zaznacz cały

        00011001 = 19 BCD
+       00011000 = 18 BCD
-----------------------
        00110001 = 31 bin
+       00000110 = 06 bin
-----------------------
        00110111 = 37 BCD

W tym przypadku również należy dokonać odpowiedniej korekty otrzymanego wyniku (pomimo, że uzyskane cyfry BCD zawierają się we właściwym przedziale). Po dodaniu 06 hex uzyskany jest wynik 37 BCD. W tym przypadku wystąpiło przeniesienie z bitu numer 3 na bit numer 4. We wskaźnikach mikrokontrolerów z rodziny C51 znajduje się wskaźnik AC (ang Auxilliary Carry – wskaźnik przeniesienia pomocniczego). Ustawienie wskaźnika AC oznacza, że nastąpiło przeniesienie z młodszej cyfry BCD na starszą cyfrę BCD. Dość złożoną operację związaną z korektą (samo dodanie jest operacją prostą, jednak należy rozpatrzeć dość złożony warunek pozwalający zdecydować, czy dodanie jest konieczne) wykonuje instrukcja korekty dziesiętnej, instrukcja DA A. W przypadku, gdy nie jest wymagana korekta, instrukcja DA nie wykonuje żadnych operacji. Podsumowując, w przypadku realizacji dodawania (ADD) liczb zapisanych w kodzie BCD należy zawsze wykonać instrukcję korekty (DA). W pewnych przypadkach wykonanie tej instrukcji nie zmieni zawartości rejestru A, w innych zostania dokonana właściwa korekta.

Re: Algorytm konwersji liczb binarnych na postać znakową

: wtorek 09 sty 2018, 14:55
autor: tasza
No mnie to się to scrollowanie bitów spodobało więc tym sposobem dalej myślę.
To prawda, że są procesory wspierające operacje na BCD, ale jak nie ma, to trzeba sobie radzić domowymi sposobami i z użyciem prostackich instrukcji. Zatem poniżej dodawanie dwóch trzycyfrowych liczb w BCD ale bazujące na przesuwaniu w prawo kolejnych nibbli czy tetrad jak kto woli, fajny patent.
Operacja wykonywana jest na jednej parze cyfr BCD (w przykładzie są więc trzy takie akcje), jedna operacja atomowa to: dodanie cyferek do siebie binarnie (wraz z wartością przeniesienia w poprzedniego obiegu), jak wyjdzie > 9 to zapamiętanej tego faktu w wartości na przeniesienie (wartość w ramce) a następnie binarne dodanie do nibbla wyniku wartości 6. Mamy wypracowane 4 bity wyniku w BCD.
Potem trzeba cały majdan przesunąć o 4 bity (tetrade) w prawo, w miejsce wyniku zaczną jakby wpływać kolejne wartości, począwszy od najmłodszej cyfry
I ponownie to samo, sumujemy 0 lub 1 (gdy było przeniesienie) z kolejnym słupkiem , robimy korekcje i wsuwamy wynik.
Na przykładzie mym ten ostatni obieg to przypadek, który dodaje wartość korekcji z poprzedniego, ale sam jej nie generuje i szafka gra.
Aha, no i to w pętelce wykonując można uogólnić na N cyferek, czyli dodawać do siebie tasiemce, pamiętając tylko aby było miejsce na wynik (N+1 cyfr)
Wykorzystywane operacje procesora to elementarz shift, rotate right, and, add – no to każdy chyba ma, nawet jak o BCD nie słyszał,

Re: Algorytm konwersji liczb binarnych na postać znakową

: wtorek 09 sty 2018, 15:07
autor: gaweł
tasza pisze:są procesory wspierające operacje na BCD, ale jak nie ma, to trzeba sobie radzić

Święte słowa, jak widać, nie ma takiej dziury, której nie da się odetkać.