簡體   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