Я пытаюсь сделать ультра-сжатый вариант brainfuck, который является эзотерическим языком программирования с 8 инструкциями. Поскольку 3 бита — это минимальный объем памяти для хранения 8 значений, я пошел на это. Часть, на которой я застрял, — это как прочитать число битов, которое не является степенью 2.
Я пытался с помощью std::bitset
, но это просто сериализуется в строку, которая составляет 1 байт на бит, что противоположно тому, что я хочу. Как бы я пошел по этому поводу?
Читайте 3 байта за раз и разбивайте их на 8 пакетов по 3 бита каждый, используя >> и & операторы. Поместите их в обычный массив uint8_t, чтобы упростить последующий доступ и переходы.
Вы не читаете биты из потока, вы читаете байты из потока.
Итак, вы должны сделать это, а затем переставить биты компонента, как вы хотите, используя побитовую арифметику.
Кстати, тот факт, что компьютеры работают в байтах, также означает, что многие из ваших программ (те, которые не имеют кратных 8 инструкций) обязательно будут тратить впустую пространство.