【问题标题】:How to logical-or two boost::dynamic_bitset objects of different size?如何逻辑或两个不同大小的 boost::dynamic_bitset 对象?
【发布时间】:2019-09-28 12:52:32
【问题描述】:

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() 理论上可以用来访问位集, 但它们似乎过于有限,无法实现不同大小的位集的逻辑 OR。

【问题讨论】:

  • 不复制是不是很重要?您基本上需要一个范围或视图(非拥有位集)来引用现有位集的一部分。如果没有这样的类,那么这个类的函数(如果存在的话)无论如何都会返回一个副本。
  • 如果 with 小于 to,有一个简单的算法可以迭代 'with' 块和二进制或它们与 'to' 块。我只需要访问块上的迭代器。

标签: c++ boost boost-dynamic-bitset


【解决方案1】:

如果您考虑一下,您不能在位集中的任意偏移处创建视图而不会受到一些惩罚,因为如果它不与字节边界对齐,则每个操作都需要首先移动所有位,例如它们与另一个操作数中的位正确对齐。

您使用它是出于性能、内存的原因还是因为您(仅)需要二进制操作?

因为如果它不是完全对性能至关重要,我建议你改用它并收工:

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 = std::max(with.size(), to.size());
    to2.resize(size);
    with2.resize(size);
    return to2 | with2;
}

或者,您可以过量使用所有集合以具有相同的大小。

我认为boost::dynamic_bitset 不支持使用现有内存。也许还有其他一些库允许这样做。

【讨论】:

  • 感谢您的回复,但这不是我的问题。
  • @Kostja 您询问是否有 API 可以直接访问数据子集(块)。似乎没有。您只能复制 all 块。如果你真的想自己实现这个,this 需要 »hacking« 实现。
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 2017-01-14
  • 2015-09-09
  • 1970-01-01
  • 2016-08-02
  • 2020-12-30
  • 2021-10-03
  • 1970-01-01
相关资源
最近更新 更多