Как логически или два объекта boost :: dynamic_bitset разного размера? - PullRequest
0 голосов
/ 28 сентября 2019

API не позволяет применять логические операции к dynamic_bitsets различного размера, в то время как мое приложение требует, чтобы, если один из наборов битов был больше другого, размер результата корректировался соответствующим образом.Мне нужно создать временную копию, чтобы обойти проблему:

using column_mask = boost::dynamic_bitset<uint64_t>;                                                
void column_mask_union(column_mask& to, const column_mask& with) {

    if (to.size() > with.size()) {
        if (with.size()) {
            column_mask tmp = with;
            tmp.resize(to.size());
            to |= tmp;
        }
        return;
    }
    if (to.size() < with.size()) {
        to.resize(with.size());
    }
    to |= with;
}

Я вижу в API есть функции to_block_range () и from_block_range (), которые теоретически могут быть использованы для доступа к битам, ноони кажутся слишком ограниченными для реализации логического ИЛИ битовых наборов разного размера.

1 Ответ

0 голосов
/ 28 сентября 2019

Если вы подумаете об этом, вы не сможете создать представление с произвольным смещением внутри набора битов без некоторого штрафа, поскольку, если оно не выравнивается по границе байта, каждая операция должна сначала сдвинуть все биты, напримерчто они правильно выровнены с битами в другом операнде.

Используете ли вы это по соображениям производительности, памяти или потому, что вам (только) нужны двоичные операции?

Потому что, если это не является критически важным для производительности, я предлагаю вам использовать его вместо этого и назвать его днем:

column_mask column_mask_union(const column_mask & to, const column_mask & with) {
    column_mask to2 = to;
    column_mask with2 = with;
    std::size_t size = with.size() > to.size() ? with.size : to.size();
    to2.resize(size);
    with2.resize(size);
    return to2 | with2;
}

В качестве альтернативы вы можете перезаписать все свои наборы, чтобы иметь одинаковый размер.

Я не думаю, что boost::dynamic_bitset поддерживает только , используя существующую память.Может быть, есть какая-то другая библиотека, которая позволяет это.

...