gpt4 book ai didi

c++ - 从整数数组构造 bitset

转载 作者:可可西里 更新时间:2023-11-01 16:38:09 25 4
gpt4 key购买 nike

构建 bitset<64> 很容易来自uint64_t :

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

但是有没有好的方法来构建一个bitset<64 * N>来自uint64_t[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 附近(带有 libstdc++ 和 -O2 的 x86-64 上的 gcc 4.9)。 Clang 的表现稍差,在 N == 160 左右收支平衡。 . Gcc 与 -O3将它推到 N == 250 .

取下端,这意味着如果您想使用 10000 位或更大的位集,这种方法可能不适合您。在 32 位平台(例如普通 ARM)上,阈值可能会降低,因此在此类平台上使用 5000 位位集时请记住这一点。然而,我认为,在远早于此之前,您应该问问自己,bitset 是否真的是正确的容器选择。

关于c++ - 从整数数组构造 bitset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29902155/

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