eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingzamiana liczbyRe: zamiana liczby
  • Data: 2013-04-10 11:43:53
    Temat: Re: zamiana liczby
    Od: firr kenobi <p...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    W dniu środa, 10 kwietnia 2013 01:18:10 UTC+2 użytkownik Ireneusz Szpilewski napisał:
    > On Sun, 07 Apr 2013 21:17:35 +0200, identyfikator: 20040501
    >
    > <N...@g...pl> wrote:
    >
    >
    >
    > > jest taka sprawa, jest sobie liczba dword (32 bity),
    >
    > > trzeba ją zamienić na skróconą wielkość pliku, np. 100kB, 1Mb, 10Mb,
    >
    > > 512kB itp...
    >
    > >
    >
    > > jak to szybko i skutecznie zrobić?
    >
    > >
    >
    > > tricki z dzieleniem przez 10 lub sumowaniem w BCD raczej odpadają, mam
    >
    > > mało pamięci i do tego rejestry 8 bitowe...
    >
    > >
    >
    > > tak w ramach rozrywki umysłowej...
    >
    > >
    >
    > > tylko BARDZO UPRZEJMIE PROSZĘ nie flejmować...
    >
    > >
    >
    >
    >
    > Takie cos ponizej wysmazylem w ramach rozrywki :-), niestety uzylem
    >
    > recznego mnozenia 4 znakowej liczby dziesietnej (cos na ksztalt BCD), ale
    >
    > za to bez dzielenia, no i na samych rejestrach 8 bit powinno zadzialac:
    >
    >
    >
    > #include <stdio.h>
    >
    >
    >
    > /* zeruj wynik */
    >
    > void dec_zero(unsigned char dec[4])
    >
    > {
    >
    > int i;
    >
    >
    >
    > for(i = 0; i < 4; i++)
    >
    > dec[i] = 0;
    >
    > }
    >
    >
    >
    > /* pomnoz wynik razy 2 i dodaj carry (0 lub 1) */
    >
    > void dec_double(unsigned char dec[4], int carry)
    >
    > {
    >
    > int i;
    >
    > int digit;
    >
    >
    >
    > for(i = 0; i < 4; i++)
    >
    > {
    >
    > digit = dec[i] * 2 + carry;
    >
    >
    >
    > if(digit > 9)
    >
    > {
    >
    > digit -= 10;
    >
    > carry = 1;
    >
    > }
    >
    > else
    >
    > {
    >
    > carry = 0;
    >
    > }
    >
    >
    >
    > dec[i] = digit;
    >
    > }
    >
    > }
    >
    >
    >
    > /* wylicz wynik result[4] dla podanej liczby number[4] */
    >
    > /* i zwroc indeks potegi 1024 (0 = B, 1 = KB, 2 = MB, 3 = GB) */
    >
    > int convert(const unsigned char number[4], unsigned char result[4])
    >
    > {
    >
    > int byte = 3;
    >
    > int bit = 31;
    >
    > int bit10 = 1;
    >
    > int power1024 = 3;
    >
    > unsigned char mask = 0x80;
    >
    > int hit = 0;
    >
    > int bit_is_set;
    >
    >
    >
    > dec_zero(result);
    >
    >
    >
    > while(bit >= 0)
    >
    > {
    >
    > bit_is_set = (number[byte] & mask) != 0;
    >
    >
    >
    > dec_double(result, bit_is_set);
    >
    >
    >
    > if(bit_is_set)
    >
    > {
    >
    > hit = 1;
    >
    > }
    >
    >
    >
    > if(bit10 == 0)
    >
    > {
    >
    > if(hit)
    >
    > return power1024;
    >
    >
    >
    > bit10 = 9;
    >
    > power1024--;
    >
    > }
    >
    > else
    >
    > {
    >
    > bit10--;
    >
    > }
    >
    >
    >
    > bit--;
    >
    > mask >>= 1;
    >
    >
    >
    > if(mask == 0)
    >
    > {
    >
    > mask = 0x80;
    >
    > byte--;
    >
    > }
    >
    > }
    >
    >
    >
    > return 0;
    >
    > }
    >
    >
    >
    > /* drukuj liczbe */
    >
    > void dec_print(unsigned char dec[])
    >
    > {
    >
    > int i;
    >
    > int print = 0;
    >
    >
    >
    > for(i = 3; i >= 0; i--)
    >
    > {
    >
    > if(print == 0)
    >
    > print = (dec[i] != 0 || i == 0);
    >
    >
    >
    > if(print)
    >
    > printf("%d", (int) dec[i]);
    >
    > }
    >
    > }
    >
    >
    >
    > /* programik testujacy do zabawy*/
    >
    > int main()
    >
    > {
    >
    > unsigned char number[4] = {0, 0, 0, 0};
    >
    > unsigned char result[4] = {0, 0, 0, 0};
    >
    > const char* power1024_names[4] = {"B", "KB", "MB", "GB"};
    >
    >
    >
    > while(1)
    >
    > {
    >
    > unsigned try_it;
    >
    > int power1024;
    >
    >
    >
    > printf("liczba hex: ");
    >
    >
    >
    > scanf("%x", &try_it);
    >
    > printf("liczba dec = %u\n", try_it);
    >
    >
    >
    > /* katastrofa, jesli unsigned wiekszy niz 4 bajty: */
    >
    > *(unsigned*)number = try_it;
    >
    >
    >
    > power1024 = convert(number, result);
    >
    > printf("wynik = ");
    >
    > dec_print(result);
    >
    > printf("%s\n\n", power1024_names[power1024]);
    >
    > }
    >
    >
    >
    > return 0;
    >
    > }
    >
    >
    >
    > Trzeba by to jeszcze ulepszyc, aby dzialalo sensowniejsze zaokraglanie,
    >
    > bo teraz zaokragla brutalnie w dol i np. rozmiar 2047 B pokazuje jako 1KB.
    >
    >
    co do zaokraglanie w dół to mz chyba ujdzie

    co do kodu to nie rozumiem tego kodu, jak to
    działa? - jedzie jakos po 32 bitach i co
    jakis czas mnozy przez dwa i costam porownuje?

    (kod raczej nie jest idealny ale jak działa
    to spox,

    duzy plus za odpowiedz na temat, bardziej
    tak wlasnie widze grupe jako miejsce gdzie
    odowiada sie na pytania a nie ... (wiadomo
    co )







Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: