这个 bitset 生成可以做得更好或更有效率吗?

Can this bitset generation be made better or more efficient?

问题:给定一个整数led作为输入,用led[=创建一个位集(16位) 21=] 位设置为 1。然后,创建以下序列(假设在这种情况下 led = 7):

0000000001111111
0000000000111111
0000000001011111
0000000001101111
0000000001110111
0000000001111011
0000000001111101
0000000001111110

注意向右移动的是一个“零”。我写的代码是:

void create_mask(int led){
    string bitString;
    for (int i = 0; i < led; i++){
        bitString += "1";
    }
    bitset<16> bitMap(bitString);

    for (int i = led; i >= 0; i--){
        bitMap[i] = false;
        cout << bitMap << endl;
        bitString = "";
        for (int j = 0; j < led; j++){
            bitString += "1";
        }
        bitMap = bitset<16> (bitString);
    }
}

我不喜欢我将每个位都设置为 0 的嵌套循环。我认为可以通过降低复杂性来做得更好。

如果您想使用 std::bitset,您可以利用移位和异或运算等位功能。在这个解决方案中,我有一个全部为 1 的基本位集,一个向右移动的掩码,并且我在每次迭代中输出两者的 XOR。

未测试。

void output_masks(int bits, std::ostream& os){
    std::bitset<16> all_ones((1 << bits) - 1);
    std::bitset<16> bit_mask(1 << (bits - 1));

    while (bit_mask.any()) {
        os << (all_ones ^ bit_mask);
        bit_mask >>= 1;
    }
}

这是我想出的:

void createMask(int len) {
    std::bitset<16> bitMap;
    for (int i = 1; i < len; i++)
    {
        bitMap.set();
        bitMap >>= 16 - len;
        bitMap[len - i] = false;
        std::cout << bitMap << std::endl;
    }
}

bitMap.set() 将位集中的所有位设置为 1(或真) bitMap >>= 16 - len 将所有位向右移动,但它是 16 - 7(如果 len 为 7),所以有 9 个零和七个 1。 bitMap[len - i] = false 将位 7 - i 设置为 0(或假)。 len - i 是一种指定倒数的方法(基本上它开始在左侧设置零并根据 i 的值向右工作) 循环从 1 开始,因为无论如何您都将该位设置为 0 并防止程序在 len 为 16 时崩溃 –