gpt4 book ai didi

c++ - 简单大整数的位集、bool vector 或 int vector

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:07 25 4
gpt4 key购买 nike

我有一个算法,我目前使用两个无符号整数作为位图来存储有关输入的信息;这将最大输入大小限制为 64,因此我想创建一个版本,其中整数由位集或简单的大整数替换。我开始使用 vector 编写一些东西,但是环顾四周,我看到很多答案告诉我避免使用 vector

我需要的操作:

  • 初始化为全零。
  • 左移(乘以二)并设置新的 lsb。
  • 添加并设置 msb。
  • 比较两个集合,首先找到最小的/按字典序排列的。

创建它们时,我知道最大位数,但一开始我只需要 1 位;然后,在每一步中,一组向左移动,而另一组将添加一个新的最高位:

{
a <<= 1;
a[0] = x;
b[++msb] = y;
if (a < b) b = a;
}

如果我创建大小为 1 的位集,然后逐渐扩展它们,与我立即将长度设置为最大值并可能有数千个前导零相比,比较可能会更快?

那么我应该继续使用 vector 还是使用 std::bitset(遗憾的是它是固定大小的),或者编写一个简单的双整数实现,该实现仅能够使用无符号整数 vector 进行上述操作?


使用 vector 你可以用零长度初始化 vector :

std::vector<bool> a(0), b(0);

然后像这样执行上面提到的操作:

{
a.push_back(x);
b.insert(b.begin(), y);
if (a < b) b = a;
}

最佳答案

我认为 boost::dynamic_bitset 就是您所追求的。

这是一个满足您要求的示例:

#include <iostream>
#include <boost/dynamic_bitset.hpp>
int main() {
boost::dynamic_bitset<> a(3, 2); // a = 010
a[0] = true; // a = 011
a.push_back(true); // a = 1011
boost::dynamic_bitset<> b = a; // b = 1011
a <<= 1; // a = 0110
bool aless = a < b; // true
unsigned long al = a.to_ulong(); // al = 6
std::cout << "a=" << a << ", al=" << a.to_ulong() << "\n"
<< "b=" << b << ", bl=" << b.to_ulong() << "\n"
<< "a<b=" << (a<b) << "\n";
}

一些注意事项:

  • 该对象完全是动态的,没有机会利用您对最大尺寸的了解。我相信它甚至不使用小对象优化,所以它总是会分配一些动态内存。
  • 构造器有点奇特。第一个参数是位数,第二个是它们的整数值。这意味着要按照您的要求初始化为单个真位,您将使用 dynamic_bitset<>(1, 1) .遗憾的是没有 initializer_list构造函数所以你不能只做 a = {true} .也许最清楚的事情是默认构造对象和 push_back(true)在单独的一行上。
  • push_back影响最高有效位,即左边的值。这是因为“front”表示元素 0,即最低有效位。
  • 左移运算符不会增加对象,因此要将项目附加到前面,您需要:
    1. a.push_back(false) (你推送的值并不重要,因为它很快就会被丢弃)。
    2. a <<= 1
    3. a[0] = x如果您想设置新值。
  • to_ulong()仅当对象具有足够少的元素以适合 unsigned long 时才有效在你的平台上。请注意,它不是 unsigned long long。 ,所以即使在 64 位系统上,它也可能是 32 位的。
  • 还有其他一些值得研究的有趣方法,例如any() , all()count() .

关于c++ - 简单大整数的位集、bool vector 或 int vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46331998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com