byte to bits

0

Witam

Mam taki problem, że potrzebuję wyciągnąć z 1 bajta część bitów, tzn. bit może być jeden lub będę potrzebował np. 3 bity z konkretnego bajtu. Dane wejściowe są przechowywane w tablicy bajtów, ale konkretne informacje są w bitach. Więc pobieram sobie konkretny bajt i próbuję się dostać do bitów. Znalazłem taką klasę BitArray, która w zasadzie by mi odpowiadała do dalszych operacji, ale nie wiem jak przejść z byte na BitArray :( Może jakieś pomysły lub ewentualnie inne rozwiązanie całego problemu????

0

Znalazłem rozwiązanie.

Klasa BitArray przyjmuje w konstruktorze tablicę bajtów (byte[]) i zamienia ją na bity. Ja podawałem w konstruktorze jeden bajt i wtedy klasa traktowała ten parametr jako rozmiar tablicy a nie bity które trzeba wrzucić do tablicy.

0

nie prościej (i znacznie szybciej) zastosować operacje logiczne? x & 3 - dolne dwa bity, x & 31 - najwyższy bit, itp.

//dopisane
@adf88 - he he ups. wychodzi zmeczenie. 0x80 dla siódmego bitu licząc od zera.

0

Najwyższy bit to 0x80 ;), po kolei są to: 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 lub po prostu (1 << numer_bitu-1)

Jak chcesz np. sparwdzić, czy bity numer 3 i 5 są jedynkami to robisz:

const int maska = (1 << 2) | (1 << 4);
if((bajt & maska) == maska) ...

Jak chcesz sprawdzić, czy jakikolwiek z bitów jest jedynką to:

if((bajt & maska) != 0) ...
0

Wszystko fajnie tylko nie jarzę tak do końca jak wykorzystywać te maski. Nie potrafię ogarnąć tego tematu od tej strony :( Dla mnie łatwiej jednak jest wrzucić bajty do BitArray i dopiero tutaj sprawdzać wartości, tym bardziej, że nie zawsze muszę wyciągnąć jeden bit, może się zdarzyć, że moja wartość znajduje się na kilku bitach i dopiero z tego wycinka mogę złożyć konkretną wartość.

0

A jak sprawdzić czy bit jest zerem ? np kompinację bit 5 i 6 może być ustawiony na 0, 0 albo 0, 1

0

marek12 - najpierw zdecyduj czy chcesz pracowac na tablicy jedno-bitowych elementów czy może grupach bitów o określonej długości np 3 bitowych.
Jeśli wystarczą ci pojedyncze bity to BitArray jest chyba najprostszyn (i gotowym) rozwiązaniem.
W przypadku grup sprawa trochę Ci się skomplikuje. Gdy długość takiej grupy to 2 lub 4 sprawa jest trywialna, dla pozostałych wartości np 3,5,6,7,9,10,11..31 będziesz się musiał trochę narobić z powodu nakładania się grupy bitowej na granicę bajtu czy słowa maszynowego (najczęściej 32 lub 64).

Gry długość grupy równa jest np 7 bitów to może warto zrezygnować z podejścia bitowego i przejść na zwykły bajt (co prawda kosztem marnotrawstwa 1/8 przestrzeni) zyskując szybkość działania i prostotę kodu ?

1

Wlodek55 - marek wypowiadał się dwa lata temu...

melancholy -

bool IsBitSet(byte b, int nd) { return b & (1 << n) != 0 ? true : false; }

// minęły dwa lata i można to zapisać

bool IsBitSet(byte b, byte n) { return b & (1 << n) != 0; }
  • Ł

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