Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 此位集生成是否可以更好或更高效?_C++_Mask_Bitset - Fatal编程技术网

C++ 此位集生成是否可以更好或更高效?

C++ 此位集生成是否可以更好或更高效?,c++,mask,bitset,C++,Mask,Bitset,问题:给定一个整数led作为输入,创建一个16位的位集,led位设置为1。然后,创建以下序列,假设在这种情况下led=7: 0000000001111111 0000000000111111 0000000001011111 0000000001101111 0000000001110111 0000000001111011 0000000001111101 0000000001111110 请注意,它是一个向右移动的零。我写的代码是: void create_mask(int led){

问题:给定一个整数led作为输入,创建一个16位的位集,led位设置为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;
    }
}

这就是我想到的:

无效创建马斯金透镜{ 位集位图; 对于int i=1;i>=16-透镜; 位图[len-i]=假; std::cout=16-len将所有位向右移位,但如果len为7,则移位为16-7,因此有9个0和7个1。 位图[len-i]=false将位设置为7-i为0或false。len-i是一种指定倒数的方法,基本上它开始在左侧设置零,并根据i的值向右工作
循环从1开始,因为您正在将位设置为0,以防止程序在len为16时崩溃–

这里的限制因素可能是LED点亮、人眼识别和LED熄灭所需的时间。尝试优化已经比物理设备i快10000倍的代码t的驾驶是一件愚蠢的差事。但是看看std::string构造函数的文档。有一个构造函数可以让字符串立即充满1,而不是附加一堆1。@JohnFilleau哦,它与物理led完全无关。它是一个用来解决UVA问题的函数:什么是UVA?我不熟悉它在首字母缩写中,您可以从整数创建位集,而不是从字符串创建位集。