рассмотрим следующие переменные
u_int8_t newData[BITSTREAM_SIZE/BYTE_SIZE];
bool bits[BITSTREAM_SIZE];
newData инициализируется нулями и массивом битов случайных единиц и нулей (сделанным в виде массива одиночных битов, поскольку поток битов является динамическим), размер битового потока равен или больше кратному 8.
После некоторых необходимых вычислений с набором битов мне нужно преобразовать массив битов в массив байтов. Для простоты я просто хочу знать, какие операции необходимы, чтобы поместить 8 бит в 1 байт по порядку (так как наиболее значимые биты располагаются в начале, а наименее в конце).
размер битового потока равен или превышает кратное 8. Поэтому мне просто нужно зациклить байт 8 раз за раз
std::bitset<1> bits[BITSTREAM_SIZE];
не имеет особого смысла. Вы имеете в виду std::bitset<BITSTREAM_SIZE> bits;
?
Нет, размер битового потока является динамическим.
Тогда вы, вероятно, захотите вместо этого std::vector<bool>
(для эффективности использования пространства) или std::vector<char>
(для производительности). std::bitset<1>[BITSTREAM_SIZE]
не более полезен, чем массив bool
(и он также фиксирован, если вы не используете VLA).
Хорошо, но в любом случае, мне нужен ответ на мой вопрос, пожалуйста.
И массив bool потребует меньше места, чем хранение множества битов внутри массива. Имейте в виду, что эти наборы битов содержат не один бит, а фактически 64 бита, поэтому каждый из них тратит по 63 бита. С типом bool вы тратите только 7 бит на bool.
спасибо за предложение типа, редактирую основной пост
Почти в любом случае использования, который имеет массив битов, упакованный массив битов (то есть результат здесь) может делать то же самое лучше, используя упакованную природу для работы с несколькими битами одновременно. Теперь я не знаю, каков именно вариант использования ... но битовые потоки, как правило, являются одним из таких случаев, а не исключением.
Проект, над которым я работаю, не мой, поэтому я должен уважать тип и размер данных, с которыми работают остальные функции.
Попробуй это:
// assumes BITSTREAM_SIZE is a multiple of 8
uint8_t newData[BITSTREAM_SIZE/BYTE_SIZE];
bool bits[BITSTREAM_SIZE];
for (size_t i = 0, j = 0; i < sizeof(newData); ++i)
{
newData[i] = 0;
for (size_t j = 0; j < 8; ++j)
newData[i] = (newData[i] << 1) | (bits[(8 * i) + j] != false);
}
ага, ты попал! я не знал, что оператор OR имитирует его, чтобы расположить его по порядку.
На самом деле порядок определяется как оператором сдвига (умножает на два), так и оператором or (добавляет ноль или единицу в зависимости от).
Сначала определитесь с размерами. Если
BITSTREAM_SIZE
равно7
, вы инициализируетеu_int8_t newData[0];
Это не подходит.