2013-07-08 13 views
5

Mam jeden bajt, który zawiera dwie wartości. Oto dokumentacja:Jak pracować z bitami w bajcie

Bajt władzy jest podzielony na dwa pola. Trzy najmniej znaczące bity przenoszą poziom uprawnień użytkownika (0-5). Pięć najbardziej znaczących bitów o wartości ma wyższy próg odrzucania. Jeśli te bity są ustawione na zero, próg odrzuceń systemu jest używany do określenia, czy wynik dla tego użytkownika jest akceptowany lub odrzucany. Jeśli nie są one równe zeru, wartość tych bitów pomnożona przez dziesięć będzie wartością progową dla tego użytkownika w postaci .

Urząd Byte:

7 6 5 4 3 ......... 2 1 0 
Reject Threshold .. Authority 

Nie mam żadnego doświadczenia w pracy z bitów w C#.

Czy ktoś może mi pomóc przekonwertować bajt i uzyskać wartości wymienione powyżej?

Próbowałem następujący kod:

BitArray BA = new BitArray(mybyte); 

ale długość wraca jako 29 i Liczyłam 8, jest każdy bit w bajcie.

- Dzięki za szybką pomoc wszystkich. Teraz działa! Fantastyczny internet.

+0

Możesz również znaleźć [ten wpis] (http://stackoverflow.com/questions/93744/most-common-c-sharp-bitwise-operations-on-enums). –

Odpowiedz

7

Zamiast BitArray, łatwiej można użyć wbudowanego w bitwise AND i right-shift operatora następująco:

byte authorityByte = ... 

int authorityLevel = authorityByte & 7; 
int rejectThreshold = authorityByte >> 3; 

Aby uzyskać pojedynczy bajt z powrotem, można użyć operatora bitwise OR i left-shift:

int authorityLevel = ... 
int rejectThreshold = ... 

Debug.Assert(authorityLevel >= 0 && authorityLevel <= 7); 
Debug.Assert(rejectThreshold >= 0 && rejectThreshold <= 31); 

byte authorityByte = (byte)((rejectThreshold << 3) | authorityLevel); 
+0

Czy możesz mi powiedzieć, jak przekonwertować te dwie wartości z powrotem na jeden bajt? – Anonymous

3

Używasz niewłaściwego konstruktora (prawdopodobnie).

Ten, który używasz jest prawdopodobnie this one, natomiast trzeba this one:

var bitArray = new BitArray(new [] { myByte }); 
5

Korzystanie z BitArray jest nieprawidłowy. Następująco:

BitArray BA = new BitArray(mybyte); 

..will niejawnie przekształca się int. Kiedy tak się dzieje, uruchamiasz tego konstruktora:

BitArray(int length); 

.. stąd jego utworzenie z określoną długością.

Patrząc na MSDN (http://msdn.microsoft.com/en-us/library/x1xda43a.aspx) chcesz to:

BitArray BA = new BitArray(new byte[] { myByte }); 

Długość będzie wtedy 8 (zgodnie z oczekiwaniami).

3

Aby uzyskać wartość z pięciu najbardziej znaczących bitów w bajcie jako liczba całkowita, shift bajt w prawo przez 3 (tj 8-5) i ustawić trzy górne bity do zera przy użyciu bitowe AND operację, jak to :

byte orig = ... 
int rejThreshold = (orig >> 3) & 0x1F; 
  • >> jest "przesunięcie w prawo" operator. Przesuwa bity 7..3 na pozycje 4..0, upuszczając trzy dolne bity.
  • 0x1F jest liczbą binarną 00011111, która ma górne trzy bity ustawione na zero, a dolne pięć bitów jest ustawione na jeden. AND -ing z tą liczbą zeruje trzy górne bity.

Ta technika może zostać uogólniona, aby uzyskać inne wzorce bitowe i inne integralne typy danych. Przesuwasz wybrane bity do najmniej znaczącej pozycji i stosujesz maskę, która "wycina" żądaną liczbę bitów. W niektórych przypadkach zmiana nie będzie konieczna (np. Gdy otrzymasz najmniej znaczącą grupę bitów). W innych przypadkach, takich jak powyższe, maskowanie nie będzie konieczne, ponieważ otrzymasz najbardziej znaczącą grupę bitów w typie bez znaku (jeśli typ jest podpisany, wymagane będzie AND).