Operacje na bitach

0

Jakie są funkcje operujące na pojedyńczych bitach ? Chodzi mi o np zamiane kolejności (swap) dla 8, 16, 32 bitowych liczb. Albo czy istnieje możliwość odczytu z pliku pojedyńczych bitów ?

P.S. Ma ktoś może algorytm kompresji/dekompresji LZW, odczytu plików tiff .... i inne rzeczy z tifami związane ?

z góry dziękuje za odpowiedź

0

Odczyt bitów z plików --> TBitStream Dryobatesa.
Operacje bitowe przeprowadza sie operatorami np. AND, OR, XOR, NOT... itd. Poszukaj w helpie.

0

Zawsze też możesz użyć wstawki asm (choć w tym wypadku wystarczy za pewnoe or, xor, not, and).
Co do kompresji LZW to mam przy okzazji opisu gif. Niezawiele tego, ale może coś się da wyciągnąć.
Mam też troszkę informacji ogólnych na temat słownikowych metod kompresji. W każdym razie gotowego algorytmu jeszcze nie mam.

0

a nie wrzucił byś mi na @ ?

0

Może się przyda:

function Lo(X): Byte;

Description

In Delphi code, Lo returns the low-order Byte of the argument X as an unsigned value. X is an expression of type Integer.

function Hi(X): Byte;

Description

In Delphi code, use Hi to obtain the high-order byte of an expression of type Word or Integer.

Note: Hi treats Integer as a 16-bit value, even if it is 32-bit.

0

To jeszcze Swap można dołączyć. Zamienia starszy bajt z młodszym.
Na maila już poszło o LZW w gifach. To drugie ogólnie o kompresji na razie nie będę wysyłał (troszkę duże). Raczej ogólnie jest tam opisane.

0

a jak się sprawa ma jeśli chodzi o zapis i odczyt do pliku ? Jeśli mam przykładowo odczytywać po 3 bity z pliku ? Czy jest to możliwe ? Czy trzeba czytać cały Bajt po bajcie i dzielić potem na 3-bitowe części ?

0

a jak się sprawa ma jeśli chodzi o zapis i odczyt do pliku ? Jeśli mam przykładowo odczytywać po 3 bity z pliku ? Czy jest to możliwe ? Czy trzeba czytać cały Bajt po bajcie i dzielić potem na 3-bitowe części ?

Komputery oparte na konstrukcji intelowskiej mają pamięć podzieloną na bajty. I to właśnie jest najmniejszy możliwy fragment jaki możesz odczytać. Nie ma innego wyjścia, jak odczyt całego bajtu i dopiero potem operacje na poszczególnych bajtach. W TBitStream jest pewne bardzo proste metody zapisu pojedynczych bitów (w rzeczywistości to są one buforowane, aż będzie cały bajt). Jest tam kilka błędów, z którymi nie mogłem sobie poradzić w sposób automatyczny (trochę błędnie wskazuje rozmiar i nie można korzystać tak jak ze zwykłego TFileStream, ale nie ma wpływu na zapis i odczyt).

0

co zrobic jesli mam np w pliku zapisane cos w pojedynczych bitach i jest tych informacji powiedzmy 13. Założenie dalsze jest takie że plik ma zapisane przykładowo te 2 bajty (16 bitów). Jak teraz mając odczytane te dwa bajty wyciągnąć z nich te pojedyńcze bity i w zależności od ustawienia danego bitu (0 lub 1) przypisać np 1 w tablicy a = array [1..13] od byte;

A jak sprawa się ma gdy np będzie coś zapisane w porcjach 3 bitowych ? lub więcej np 9 bitowych ?

0

for i := 0 to 12 do
a[i+1] := (Zmienna shr i) and 1;
Czyli np. Zmienna: Word:
0001110010010111
To Tablica:
a[1]=1;
a[2]=1;
a[3]=1;
a[4]=0;
a[5]=1;
a[6]=0;
...

Od najmniej znaczącego.
A przy użyciu TBitStream to nie jest istotne w jakich porcjach zapisuje.

0

wielkie dzięki to już mi bardzo dużo pomoże, niestety mam jeszcze jedno pytanie (again : ))

założenia :

w pliku mam zapisane np : 27 bitów (dopełnione zerami do 32)
elementarna informacja to 3 bity --> mamy więc zapisane 9 informacji
podstawowa jednostka odczytu 1 bajt (8 bitów) --> czytamy 4 jednostki
Jak wyciągnąć te 9 informacji z tych 4 bajtów ? (ewentualnie schemat ogólny dla porcji n-bitowej przy czym n>1 and n

0

Znowu powinienem odesłać do TBitStream...
Ale niech będzie.
W tym wypadku lepiej użyć szczególnego przypadku.
Jeżeli mamy tylko 4 bajty to można to zastąpić przez DWord.
Czyli:

for i := 1 to 9 do
szukane[i] := (DWord(Dane) shr 3*(i-1)) and 7; //7 czyli ustawione 3 najmłodsze bity

Przy ogólnym schemacie, jeżeli więcej niż 4 bajty mamy do odczytania, to należy przesówać resztę, jaka zostaje (to cudownie działałoby w assemblerze :) )

0

Wybacz mi Dorybates : ) ale jeszcze zadam pytanie (juz nawet nie mówię że ostatnie : ). No to tak co do TBitStrem to sciągnąłem od Ciebie ze stronki i przeanalizowałem. Pytanie moje dotyczy operatora shr. Bo nie moge do końca zrozumieć jego działania.
On traktuje ilczbę np typu Byte jako zapis 0 i 1 ? w tym przypadku jako liczbę binarną 8-bitową ?
On nie zmienia liczby ? tylko wynik (x shr y) jest zmienionym rezultatem ?
Bo nie czaje, to znaczy przesunięcie bitowe z tego co zdążyłem poczytać, że shr to w prawo czyli co powstaje z liczby np :
01110101 shr 1
ta sama liczba podzielona przez 2^1 ?
a jak stosuje shl to tak jakbym mnożeył przez 2^y ?
no i idąc dalej tam jak napisałes :
(Zmienna shr i) and 1
to nie ma znaczenia że to po lewej stronie jest długie , a po prawej ma tylko jeden bit ?

Ogólnie chodzi mi o to jak byś w kilku słowach mi to mógł łopatologicznie wyjaśnić (jeśli masz cierpliwość ;])

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