-
Data: 2013-04-10 21:24:00
Temat: Re: zamiana liczby
Od: "Ireneusz Szpilewski" <i...@s...opole.pl> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]On Wed, 10 Apr 2013 02:19:10 +0200, Borneq <b...@a...hidden.pl>
wrote:
> Użytkownik "Ireneusz Szpilewski" <i...@s...opole.pl> napisał w
> wiadomości news:op.wvaq0ku4wyk85p@localhost...
>> Trzeba by to jeszcze ulepszyc, aby dzialalo sensowniejsze zaokraglanie,
>> bo teraz zaokragla brutalnie w dol i np. rozmiar 2047 B pokazuje jako
>> 1KB.
>
> Wystarczy dodać najpierw 512.
Nie bardzo jednak wiem, w ktorym miejscu chcialbys dodac te 512.
Zrobilem za to druga wersje, ktora z kolei zaokragla w gore, czyli np.
1025 pokazuje jako 2KB. To moze byc lepsze w tych przypadkach, gdy chcemy
miec pewnosc, ze plik napewno nie bedzie wiekszy niz ten rozmiar, ktory
podajemy. Ten drugi algorytm latwo przerobic, aby miec to, o co Ci chodzi
z dodawaniem 512 - zaokraglanie do najblizszej liczby, w gore lub w dol.
Tu jest ta nowa wersja;
#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 factor(1 lub 2) i dodaj carry (0 lub 1) */
void dec_double(unsigned char dec[4], int factor, int carry)
{
int i;
int digit;
for(i = 0; i < 4; i++)
{
digit = factor * dec[i] + 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 bit10 = 1;
int power1024 = 3;
unsigned char mask = 0x80;
int hit = 0;
int bit_is_set;
int factor = 2;
dec_zero(result);
while(1)
{
bit_is_set = (number[byte] & mask) != 0;
dec_double(result, factor, bit_is_set);
mask >>= 1;
if(mask == 0)
{
if(byte == 0)
break;
mask = 0x80;
byte--;
}
if(bit_is_set)
{
if(factor == 1)
break;
hit = 1;
}
if(bit10 == 0)
{
if(hit)
{
factor = 1;
bit10--;
}
else
{
bit10 = 9;
power1024--;
}
}
else
{
bit10--;
}
}
if(result[3] == 1 && result[2] == 0 && result[1] == 2 && result[0] == 4)
{
dec_zero(result);
result[0] = 1;
power1024++;
}
return power1024;
}
/* 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 */
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;
}
> Ale czy na pewno dzielić przez 1024 ?, dla mnie znacznie wygodniejsze
> byłoby 1000
No to zalezy, co chcemy osiagnac, czy wynik np. 123 KB ma oznaczac 123 *
1024 bajty po informatycznemu, czy 123 * 1000 bajtow po normalnemu,
(chociaz wtedy raczej pisze sie kB). Jesli to drugie, to algorytm trzeba
by znacznie zmienic.
Irek
--
Using Opera's mail client: http://www.opera.com/mail/
Następne wpisy z tego wątku
- 10.04.13 23:23 Ireneusz Szpilewski
- 10.04.13 23:52 firr kenobi
- 11.04.13 11:25 R.e.m.e.K
- 12.04.13 17:45 Ireneusz Szpilewski
- 13.04.13 01:31 Edek
- 15.04.13 23:23 Ireneusz Szpilewski
- 20.04.13 09:55 Kamil
- 20.04.13 09:53 Kamil
- 20.04.13 10:04 Ministerstwo Propagandy
Najnowsze wątki z tej grupy
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
- Młodzi programiści i tajna policja
Najnowsze wątki
- 2024-11-29 Dławik CM
- 2024-11-29 [OT] Lewe oprogramowanie
- 2024-11-29 Błonie => Sales Specialist <=
- 2024-11-29 Warszawa => IT Expert (Network Systems area) <=
- 2024-11-29 Warszawa => Ekspert IT (obszar systemów sieciowych) <=
- 2024-11-29 Warszawa => Head of International Freight Forwarding Department <=
- 2024-11-29 Białystok => Inżynier Serwisu Sprzętu Medycznego <=
- 2024-11-29 Pómpy ciepła darmo rozdajoo
- 2024-11-29 Białystok => Application Security Engineer <=
- 2024-11-29 Białystok => Programista Full Stack (.Net Core) <=
- 2024-11-29 Gdańsk => Software .Net Developer <=
- 2024-11-29 Wrocław => Key Account Manager <=
- 2024-11-29 Gdańsk => Specjalista ds. Sprzedaży <=
- 2024-11-29 Chrzanów => Specjalista ds. public relations <=
- 2024-11-27 Re: UseGalileo -- PRODUKTY I APLIKACJE UŻYWAJĄ JUŻ DZIŚ SYSTEMU GALILEO