Я пытаюсь решить проблему с помощью битовых операций в C ++, но я действительно застрял. Пожалуйста, помогите мне со следующим запросом.
1) Можно ли создать переменные A и B, которые занимают в памяти ровно 100000 бит и на которых выполняются такие операции, как A&Б действует?
2) Существует ли быстрый способ генерации B (100000 бит), так что его первые n битов равны 0, последние m битов равны 0, а оставшиеся равны 1? (например, если B было 10 битов, то число типа 0000011000)
В ответ на 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
,
Других решений пока нет …