оптимизация — точные переменные размера X-bit, которые поддерживают побитовые операции (c ++)

Я пытаюсь решить проблему с помощью битовых операций в C ++, но я действительно застрял. Пожалуйста, помогите мне со следующим запросом.

1) Можно ли создать переменные A и B, которые занимают в памяти ровно 100000 бит и на которых выполняются такие операции, как A&Б действует?

2) Существует ли быстрый способ генерации B (100000 бит), так что его первые n битов равны 0, последние m битов равны 0, а оставшиеся равны 1? (например, если B было 10 битов, то число типа 0000011000)

0

Решение

В ответ на 1, конечно, это то, для чего предназначались классы. Просто создайте класс, содержащий 100 000 бит (около 12,5 КБ) и переопределите operator& метод (двоичный, а не оператор адреса).

Хорошее начало было бы (скажем, у нас есть два целых числа, содержащих битовую маску):

BigBits BigBits::operator &(const BigBits &that) const {
BigBits bb(*this);
bb.array[0] = this->array[0] & that.array[0];
bb.array[1] = this->array[1] & that.array[1];
return bb;
}

Это не проверено, но должно дать вам основную идею. Для того, чтобы проверить это, мне пришлось бы немного написать код, включая конструкторы, деструкторы, назначения и так далее, когда это действительно должно быть ваш задача 🙂

В ответ на два это тоже легко. Единственные хитрые биты — это два крайних байта, все внутренние байты можно просто установить на все 1 бит.

Чтобы установить байты фронта, вы используете бит деления и по модулю с количеством битов в байте, а затем используете битовые маски для их установки. Битовые маски будут 0x80, 0xc0, 0xe0, 0xf0, 0xf8 и так далее, причем каждое последующее значение добавляет еще 1 бит.

Тогда вы бы использовали bitmask[bitpos % 8] в его различных формах, чтобы установить граничные байты, индексы массива которых будут bitpos / 8,

3

Другие решения

Других решений пока нет …