Zamiana liczby 2-bajtowej unsign na 5 niezależnych cyfr?

Jak najprościej można to zrobić? Pozdrawiam.

Reply to
Robert R
Loading thread data ...

Cyfr dziesietnych? To dzielic przez 10 i masz, chyba, ze od poczatku robisz arytmetyke w BCD. Jak na hex to wogole nie ma problemu;)

Reply to
T.M.F.

W czterech krokach:

  1. wyjściową liczbę dzielisz przez 10000. (dziesiętne), wynik to najstarsza cyfra, reszta...
  2. poprzednią resztę dzielisz przez 1000. wynik to druga starsza cyfra, reszta...
  3. poprzednią resztę dzielisz przez 100. wynik to trzecia starsza cyfra, reszta...
  4. poprzednią resztę dzielisz przez 10. wynik to przedostatnia cyfra, a reszta to ostatnia cyfra - jedności.

Jeśli nie masz rozkazu dzielenia, to zamiast tego robisz odejmowania dzielnika (za każdym razem od 0 do 9 sztuk - jest to jednocześnie wynik takiego emulowanego dzielenia). Jeśli nie masz rozkazu odejmowania dwubajtowego rozbijasz go na dwa odejmowania jednobajtowe z pożyczką.

Powodzenia Roman

Reply to
Roman

Użytkownik Robert R napisał:

W pamięci? Kalkulatorem Windows?

Może napisz coś więcej?

Albert

Reply to
Albert Bartoszko

Albert Bartoszko snipped-for-privacy@nt.kegel.com.pl> napisał(a):

dokładnie chodzi mi o wyświetlenie liczby 2-bajtowej (bascom - word) na 5 wyświetlaczach led. Program pisany będzie w bascomie.W jaki sposób mogę otrzymać interesującą mnie cyfrę + oddzielnie resztę którą mogę dalej dzielić? Dzielę np.65000 przez np.10000 Interesującą cyfrę wyciągam przez zaokrąglenie iloczynu (6)Następnie Uzyskaną cyfrę (6) mnożę przez poprzedni dzielnik (60000) i odejmuję od liczby wyjściowej 65000 - 60000 = 5000. itd.CZy można prościej? Pozdrawiam, dzięki.

Reply to
Robert R

A czy w BASCOMie nie ma odpowiednika funkcji sprintf albo itoa, znanych z jezyka C?

Reply to
Adam Dybkowski

Użytkownik Robert R napisał:

Matematycznie - raczej nie.

Natomiast procesory i języki ich programowania inne niż assembler narzucają swoje ograniczenia.

Jeśli masz więc narzucony język programowania to po pierwsze możesz poszukać czy nie mają gotowych funkcji co już Ci Adam sugerował.

Dalej liczenie na procesorze różni się od matematyki więc możesz optymalizować sposób wykonywania działań. W twoim przykładzie zamiast dzielenia zmiennoprzecinkowego i zaokrąglania dać dzielenie całkowite i resztę z dzielenia, jeśli użyty język ma takie możliwości.

W zależności od procesora możesz zmienić algorytm. Tu już zależy jakimi typami danych dysponuje procesor, czy ma sprzętowe dzielenie i mnożenie, oraz rozpatrywanym wypadku dość ciekawe możliwości dają rozkazy dodawania lub korekcji dziesiętnej wyniku. Ale to już raczej assembler niż Bascom ;-)

Albert

Reply to
Albert Bartoszko

W twoim przykładzie zamiast dzielenia zmiennoprzecinkowego

Język programowania może być w zasadzie dowolny.W bascomie napisałem najwięcej programów C - tylko teoretycznie przeglądanie i analiza źródeł.

No właśnie w jaki sposób uzyskać tę resztę z dzielenia całkowitego? Pewnie kryje się w jakimś rejestrze? Może Ktoś podrzuci mi kawałek kodu. Faktycznie szkoda ramu na dzielenie zmiennoprzecinkowe. Pozdrawiam.

Reply to
Robert R

Robert R snipped-for-privacy@gazeta.SKASUJ-TO.pl> napisał(a):

Najprościej to zerknąć do Helpa , ale jak Ci się nie chce ;-) to proszę: Co to za typ zmiennej unsign(ed ?) - word ? Jeśli WORD to można ...

Dim Cyfryascii As String * 5 , Liczba As Word Liczba = 65535 Cyfryascii = Str(liczba) .. Teraz odczytujesz 1 znak z ciągu i odejmujesz 48(&H30) . Są też pewnie inne sposoby ;)

Pozdrawiam Piotrek

Reply to
Piotrek Sz.

tylze ze wyjdzie to jako hex + krzaczki

Reply to
Greg(G.Kasprowicz

"Robert R" napisal:

A nie masz w bascomie operatora modulo? W C jest to AFAIR znak %. Ewentualnie zamiast dzielenia uzyj odejmowania - odejmuj zaczynajac od najwiekszej potegi 10 (u ciebie 10000) inkrementujac pierwsza cyferke, jak to co zostanie bedzie mniejsze od 10000 przestaw sie na 1000 i nastepna cferke i tak dalej az do jednosci. Algorytm jest typu "wiem ze to nieefektywne ale nie chce mi sie myslec" ale jest banalna w impelementacji w dowolnym jezyku programowania i zadziala na praktycznie kazdym procku :) GRG

Reply to
Gregor

Greg\(G.Kasprowicz\) snipped-for-privacy@gmail.com napisał(a):

Ja tak robię i nie mam żadnych krzaczków ;) Oto 2 przykłady:

$regfile = "m8def.dat" $crystal = 1000000

Dim Cc(1)as Byte At 96 , Cyfryascii As String * 5 At 97 Dim Y As String * 1 , X As Byte , Z As Byte Dim Liczba As Word

Liczba = 65432 Cyfryascii = Str(liczba)

'pierwszy LEGALNY sposób For X = 1 To Len(cyfryascii) Y = Mid(cyfryascii , X , 1) Z = Asc(y) - 48 'w zmiennej Z mamy kolejno dziesiątki tysięcy,jedności tysięcy 'setki,dziesiątki,jedności

Next X

Cyfryascii = Str(liczba)

'drugi "MNIEJLEGALNY" sposób , ale także mniej PAMIĘCIOŻERNY For X = 2 To 6 Cc(x) = Cc(x) And &H0F Next 'w tablicy Cc(2) do Cc(6) mamy kolejno dziesiątki tysięcy,jedności tysięcy 'setki,dziesiątki,jedności

I gwarantuję Ci , że to nie są ani HEX-y ani krzaczki ;-) Można sprawdić nawet w symulatorze , obserwując pamięć RAM.

Pozdrawiam Piotrek

Reply to
Piotrek Sz.

Wielkie dzięki - pomysł z zamianą zmiennej word na stringa b.dobry.Pozdrawiam.

Reply to
Robert R

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.