Tablica pól bitowych

0

Witam. Ostatnio miałem sprawdzić i wyświetlić bajty pewnej 32 bitowej liczby. Stworzyłem więc unię a w niej strukturę z polami bitowymi, każdy po 8 bitów (wyświetlałem po bajcie w hexie). Musiałem zrobić 4 zmienne po 8 bitów każda. Mniej więcej wyglądało to tak:

 
 unsigned int b1 : 8;
 unsigned int b2 : 8;
 unsigned int b3 : 8;
 unsigned int b4 : 8;

Czy da się zrobić tablice pól bitowych ? Np :

 unsigned int b[4] : 8;

Ponieważ takie coś skutkuje errorem :/
Dodam, że zmienne od b1 do b4 były w strukturze, która była w unii :)

0

Skorzystaj z przesuniec bitowych i rzutowania zeby wyluskac odpowiednie bajty z inta.

http://ideone.com/CGXM8l

0

Jeżeli nie interesuje Cię kolejność bajtów (endianness), można do tego użyć std::memcpy:

const uint32_t whatever = 0xdeadbeef;
uint8_t whatever_bytes[4] = {};

std::memcpy(whatever_bytes, &whatever, sizeof(whatever_bytes));

http://ideone.com/ACs6Oj

Dodam, że w wynikowym kodzie nie ma żadnego kopiowania, wszystko jest optymalizowane do operacji bitowych. (GCC, O2)

0

Może ja to źle zrozumiałem, ale czemu nie zrobisz np. tak:

	union
	{
		DWORD dwVal;

		struct
		{
			BYTE cByte1;
			BYTE cByte2;
			BYTE cByte3;
			BYTE cByte4;
		};

		struct
		{
			unsigned bBit1 : 1;
			unsigned bBit2 : 1;
			...
			unsigned bBit32 : 1;
		};
	}

Masz wtedy dostęp do liczby, jej poszczególnych bajtów i bitów.

0

@Bartosz Wójcik - to raczej nie ma sensu, bo całą operację wyciągania bajtów czy bitów można spokojnie obsłużyć przesunięciem bitowym i koniunkcją.

0
vector<bool> tb(8*1024*1024*1024); // użyje tylko 1 GB pamięci bo działa na bitach

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.