c – 使用布尔值设置bitset的最佳方法

假设我有3个bool类型的值

bool canwalk=true;
bool cantalk=false;
bool caneat=false;

我想设置一个表示三者的位集

std::bitset<3> foo;

如何使用布尔值构造bitset?
我想做这样的事情

 std::bitset<3> foo(canWalk,cantalk,caneat); //giving me 100

解决方法:

按照Shivendra Agarwal的例子,但是使用接收unsigned long long的构造函数,我提出了以下可变参数模板函数(更通用)

template <typename ... Args>
unsigned long long getULL (Args ... as)
 {
   using unused = int[];

   unsigned long long ret { 0ULL };

   (void) unused { 0, (ret <<= 1, ret |= (as ? 1ULL : 0ULL), 0)... };

   return ret;
 }

允许foo初始化如下

std::bitset<3> foo{ getULL(canwalk, cantalk, caneat) };

这仅适用于std :: bitset的维度不是无符号长long中的位数(使用3 whe肯定是安全的)的大小.

以下是一个完整的工作示例

#include <bitset>
#include <iostream>

template <typename ... Args>
unsigned long long getULL (Args ... as)
 {
   using unused = int[];

   unsigned long long ret { 0ULL };

   (void) unused { 0, (ret <<= 1, ret |= (as ? 1ULL : 0ULL), 0)... };

   return ret;
 }

int main()
 {
   bool canwalk=true;
   bool cantalk=false;
   bool caneat=false;

   std::bitset<3> foo{ getULL(canwalk, cantalk, caneat) };

   std::cout << foo << std::endl;
 }
上一篇:CF707D Persistent Bookcase(主席树+bitset)


下一篇:biiset用法