繁体   English   中英

从整数数组构造位集

[英]Construct bitset from array of integers

uint64_t构造bitset<64>很容易:

uint64_t flags = ...;
std::bitset<64> bs{flags};

但是,是否有一种很好的方法从uint64_t[N]构造一个bitset<64 * N> ,使得flags[0]表示最低的64位?

uint64_t flags[3];
// ... some assignments
std::bitset<192> bs{flags};  // this very unhelpfully compiles
                             // yet is totally invalid

还是我不得不循环调用set()

std::bitset没有范围构造函数,因此您必须循环执行,但是用std::bitset::set()单独设置每个位都是徒劳的。 std::bitset支持二进制运算符,因此您至少可以批量设置64位:

  std::bitset<192> bs;

  for(int i = 2; i >= 0; --i) {
    bs <<= 64;
    bs |= flags[i];
  }

更新:在注释中,@ icando引起了人们的关注,即位移是std::bitset的O(N)操作。 对于非常大的位集,这最终将吞噬批量处理的性能提升。 在我的基准测试中, std::bitset<N * 64>的收支平衡点与一个单独设置位并且不改变输入数据的简单循环相比:

int pos = 0;
for(auto f : flags) {
  for(int b = 0; b < 64; ++b) {
    bs.set(pos++, f >> b & 1);
  }
}

N == 200左右(在x86-64上,带有libstdc ++和-O2 gcc 4.9)中。 Clang的性能稍差一些,甚至在N == 160附近收支平衡。 具有-O3 Gcc将其推升至N == 250

如果使用低端,则意味着如果要使用10000位或更大的位集,则此方法可能不适合您。 在32位平台(例如常见的ARM)上,阈值可能会更低,因此在此类平台上使用5000位的位集时,请记住这一点。 但是,我要说的是,在此之前的某个地方,您应该问自己,位集是否真的是容器的正确选择。

如果从范围初始化很重要,则可以考虑使用std :: vector

它确实有一对迭代器的构造函数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM