Kompresja i Dekompresja

0

Mam takie programy do napisana jako prace domową

Program 1. Kompresja
Napisz program, który wczytuje ciąg znaków a następnie kompresuje go w następujący sposób:

  1. dzieli ciąg na bloki po trzy litery, każdą małą literę zamienia na wielką, cyfry na znak '^', pozostawia spacje, a wszystkie inne znaki na '_';
  2. każdy trzyliterowy blok zamienia na liczbę z zakresu 0..32767, tak że każdemu znakowi odpowiada jego kod ASCII zmniejszony o 64 (literze a lub A->1, literze z lub Z->26, znakowi ' '->29, znakowi ^->30, znakowi _->31); w bitach od 2 do 6 zapisany jest pierwszy znak, w bitach od 7 do 11 - drugi, a w bitach od 12 do 16 trzeci;
  3. jeśli blok jest ostatnim blokiem napisu - ustaw 'luźny' bit (najbardziej znaczący) na 1;
  4. wypisuje ciąg liczb na ekran.

Program 2. Dekompresja
Napisz program który wczyta sekwencję liczb z naturalnych mniejszych od 32768 i zamieni je z powrotem na tekst (ma to być operacja odwrotna do tej opisanej w poprzednim zadaniu). Program powinien czytać liczby tak długo, aż trafi na blok z ustawionym najbardziej znaczącym bitem - co oznacza koniec wczytywania danych.

I prawie udało mi się je zrobić ale wciąż nie mogę dojść jak zapisywać i odczytywać z konkretnych bitów. Czy ktoś mógłby być tak miły i wyjaśniłby mi to w jakiś przejrzysty sposób?

0

a w czym piszesz?

0

pascal

0

Wzór będzie mniej więcej taki:
skompresowane = (znak1zakodowany << 10) + (znak2zakodowany << 5) + (znak3zakodowany) + (czyOstatniBlok ? -32768 : 0);

Dekompresja:
znak1zakodowany = (skompresowane >> 10) & 63;
znak2zakodowany = (skompresowane >> 5) & 63;
znak3zakodowany = (skompresowane) & 63;

0

Dziękuje za odpowiedź. A mógłbyś jeszcze wytłumaczyć dlaczego postępuje się w ten sposób?

0

Jeśli masz dwie wartości, odpowiednio m-bitowe i n-bitowe, to aby je połączyć najefektywniej najlepiej przesunąć pierwszą o n bitów w lewo i dodać drugą czyli wykonać (pierwszaWartość << n) + drugaWartość. Powstanie liczba (m+n) bitowa.

& to maskowanie. 63 to 11111 w systemie dwójkowym.

EDIT:
Oj, nie miało być 63 a 31.

0

Tyle, że w Pascalu nie masz operatora << tylko shl o ile dobrze pamiętam, jak to jest z bit and nie pamiętam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1