Вставить по порядку ряд битов в байт (u_int8_t)

рассмотрим следующие переменные

u_int8_t newData[BITSTREAM_SIZE/BYTE_SIZE];
bool bits[BITSTREAM_SIZE];

newData инициализируется нулями и массивом битов случайных единиц и нулей (сделанным в виде массива одиночных битов, поскольку поток битов является динамическим), размер битового потока равен или больше кратному 8.

После некоторых необходимых вычислений с набором битов мне нужно преобразовать массив битов в массив байтов. Для простоты я просто хочу знать, какие операции необходимы, чтобы поместить 8 бит в 1 байт по порядку (так как наиболее значимые биты располагаются в начале, а наименее в конце).

Сначала определитесь с размерами. Если BITSTREAM_SIZE равно 7, вы инициализируете u_int8_t newData[0]; Это не подходит.

Drew Dormann 16.02.2023 00:03

размер битового потока равен или превышает кратное 8. Поэтому мне просто нужно зациклить байт 8 раз за раз

Scary Monsters 16.02.2023 00:06
std::bitset<1> bits[BITSTREAM_SIZE]; не имеет особого смысла. Вы имеете в виду std::bitset<BITSTREAM_SIZE> bits;?
LHLaurini 16.02.2023 00:07

Нет, размер битового потока является динамическим.

Scary Monsters 16.02.2023 00:10

Тогда вы, вероятно, захотите вместо этого std::vector<bool> (для эффективности использования пространства) или std::vector<char> (для производительности). std::bitset<1>[BITSTREAM_SIZE] не более полезен, чем массив bool (и он также фиксирован, если вы не используете VLA).

LHLaurini 16.02.2023 00:12

Хорошо, но в любом случае, мне нужен ответ на мой вопрос, пожалуйста.

Scary Monsters 16.02.2023 00:15

И массив bool потребует меньше места, чем хранение множества битов внутри массива. Имейте в виду, что эти наборы битов содержат не один бит, а фактически 64 бита, поэтому каждый из них тратит по 63 бита. С типом bool вы тратите только 7 бит на bool.

digito_evo 16.02.2023 00:18

спасибо за предложение типа, редактирую основной пост

Scary Monsters 16.02.2023 00:20

Почти в любом случае использования, который имеет массив битов, упакованный массив битов (то есть результат здесь) может делать то же самое лучше, используя упакованную природу для работы с несколькими битами одновременно. Теперь я не знаю, каков именно вариант использования ... но битовые потоки, как правило, являются одним из таких случаев, а не исключением.

harold 16.02.2023 11:16

Проект, над которым я работаю, не мой, поэтому я должен уважать тип и размер данных, с которыми работают остальные функции.

Scary Monsters 16.02.2023 16:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

// 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 имитирует его, чтобы расположить его по порядку.

Scary Monsters 16.02.2023 01:52

На самом деле порядок определяется как оператором сдвига (умножает на два), так и оператором or (добавляет ноль или единицу в зависимости от).

Michaël Roy 16.02.2023 02:43

Другие вопросы по теме

Похожие вопросы