Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Побитовый массив


Автор: mishapk 10.5.2012, 11:46
Добрый день.
Имею устройство к которому обращаюсь через COM порт
В ответ получаю нужные мне данные
unsigned char Datar[512];
ReadFile(hCom, &Datar[0], AmountReq, &wn, NULL);

Получаю указатель на DATA :
char* ptr;
ptr = &Data[0];
Подскажите как относительно этого указателя можно смещаться в памяти побитова и получать значение этих бит (0 или 1) на заданное число n. 
Всего 128 бит

Автор: Earnest 10.5.2012, 11:57
Побитово указатель смещать нельзя. Минимально-адресуемая ячейка памяти - байт. Доступ к битам нужного байта обычно осуществляется с помощью маски. 1 -  младший бит, 1 << i  - i-бит.

Автор: feodorv 10.5.2012, 12:25
Цитата(Earnest @  10.5.2012,  12:57 Найти цитируемый пост)
Побитово указатель смещать нельзя. Минимально-адресуемая ячейка памяти - байт. Доступ к битам нужного байта обычно осуществляется с помощью маски. 1 -  младший бит, 1 << i  - i-бит.

То есть:

Код

bitValue = ptr[n/8] & (0x1u << (n%8));

где:
* ptr - массив байт
* n - номер бита
* bitValue - равно 0, если бит сброшен;  не равно 0, если бит установлен.

ЗЫ Только при этом работать лучше с unsigned char, чем с просто char.

Автор: borisbn 10.5.2012, 12:56
если нет антипатии к бусту, то можно так

Код

#include <boost/dynamic_bitset.hpp>

...
   unsigned char bytes[512];
   ReadFile(hCom, &bytes[0], AmountReq, &wn, NULL);

   bytesCount = 128 / 8; // кол-во байт, необходимых для хранения 128-ми бит

   boost::dynamic_bitset< unsigned char > bits( bytes, bytes + bytesCount );
   bool bit42 = bits[ 42 ];

Автор: mishapk 10.5.2012, 13:38
Цитата(feodorv @  10.5.2012,  12:25 Найти цитируемый пост)
bitValue = ptr[n/8] & (0x1u << (n%8));

Спасибо именно то что мне ми надо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)