【问题标题】:How to initialize a bitset type all bits to 1如何将位集类型的所有位初始化为 1
【发布时间】:2013-09-02 00:33:49
【问题描述】:

我知道 set() 函数用于已构建的 bitset 对象,但我需要一个所有位均为 1 的已构建 bitset。这种情况是默认函数参数。 例如:

void bar(std::bitset<100> flags = X) {
}

X 应该是什么,-1 可能适用于前 64 位,但不是全部。

【问题讨论】:

  • 我认为反向逻辑应该是一种方式,0表示设置,1表示未设置。
  • 但是为什么不直接写 std::bitset().set() 而不是 X?
  • 我需要一个默认参数,我想在调用函数bar()时省略参数
  • 这对我有用(在 VS2012 上测试,禁用语言扩展): void bar(std::bitset flags = std::bitset().set() ) { std::cout
  • 或者flags = ~std::bitset&lt;100&gt;()

标签: c++ std-bitset


【解决方案1】:
std::bitset<100> bs;
bs.set();

或者合并成1条语句:

std::bitset<100> bs  = std::bitset<100>().set();

在 C++11 中:

auto bs = std::bitset<100>{}.set();

编辑:或更好地使用std::move 来避免复制,因为set 返回左值引用bitset&amp;

auto bs = std::move(std::bitset<100>{}.set());

operator ~flip()set() 的性能:

std::bitset<100> bs;
clock_t t;
t = clock();
for(int i = 0; i < 1000000; i++) {
    bs = std::bitset<100>().set();
}
t = clock() - t;
std::cout << "Using set() cost: " << t << " clicks." << std::endl;

t = clock();
for(int i = 0; i < 1000000; i++) {
    bs = ~std::bitset<100>();
}
t = clock() - t;
std::cout << "Using ~ cost: " << t << " clicks." << std::endl;

t = clock();
for(int i = 0; i < 1000000; i++) {
    bs = std::bitset<100>().flip();
}
t = clock() - t;
std::cout << "Using flip cost: " << t << " clicks." << std::endl;

输出:

Using set() cost: 59 clicks.
Using ~ cost: 104 clicks.
Using flip cost: 75 clicks.

令人惊讶的是set()operator ~flip 快得多

【讨论】:

  • ~ 需要 CPU 读取、修改、写入。 set 只需要一次写入,而且它们都非常快,实际上差别很小。
  • @MooingDuck 有道理
  • 我认为我以前从未见过读取会产生任何性能差异的代码!令人印象深刻。
  • @MooingDuck 我刚刚从参考资料中读到~ 实际上复制了原始位集(返回bitset 而不是bitset&amp;),所以速度要慢得多。类似的操作flip(),不过修改了原来的bitset和返回引用,但还是比set()慢,差别更小
  • 是“bitset bs = bitset().set();”高效的?因为它正在创建一个设置了 100 位的临时位集对象,然后将其复制到 bs。我的理解是否正确,如果正确,它是否有效(与 bitset bs; bs.set() 相比)?
【解决方案2】:

你可以使用std::bitset&lt;100&gt; = std::bitset&lt;100&gt;(std::string(100, '1')),但是 imo 有点丑

【讨论】:

  • 与其他选项相比,我真的很喜欢这个。
  • 除非它会很慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 2014-06-29
  • 1970-01-01
  • 2014-06-22
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多