如何将bitset类型的所有位初始化为1

use*_*541 8 c++ std-bitset

我知道已经构造的bitset对象的set()函数,但我需要一个构造的bitset,所有位都是1.这种情况是一个默认的函数参数.例如:

void bar(std::bitset<100> flags = X) {
}
Run Code Online (Sandbox Code Playgroud)

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

tex*_*uce 13

std::bitset<100> bs;
bs.set();
Run Code Online (Sandbox Code Playgroud)

或者合并成1个声明:

std::bitset<100> bs  = std::bitset<100>().set();
Run Code Online (Sandbox Code Playgroud)

在C++ 11中:

auto bs = std::bitset<100>{}.set();
Run Code Online (Sandbox Code Playgroud)

性能std::move,set并且bitset&:

auto bs = std::move(std::bitset<100>{}.set());
Run Code Online (Sandbox Code Playgroud)

输出:

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;
Run Code Online (Sandbox Code Playgroud)

令人惊讶的operator ~是比flip()和更快set()

  • 是“bitset&lt;100&gt; bs = bitset&lt;100&gt;().set();” 高效的?因为它正在创建一个设置了 100 位的临时 bitset 对象,然后将其复制到 bs。我的理解是否正确,如果正确,它是否有效(与 bitset&lt;100&gt; bs; bs.set() 相比)? (2认同)

Gui*_*ume 6

你可以使用,std::bitset<100> = std::bitset<100>(std::string(100, '1'))但它有点丑陋的imo

  • 除了它会很慢. (4认同)