Можно ли сделать это поколение битовых наборов лучше или эффективнее? - PullRequest
0 голосов
/ 04 августа 2020

Проблема: Учитывая целое число 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);
    }
}

Мне не нравится вложенный l oop, где я устанавливаю каждый бит в 0. Я думаю, что это можно было бы улучшить с меньшей сложностью.

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Вот что я придумал:

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 нулей и семь единиц. bitMap[len - i] = false устанавливает бит 7 - i в 0 (или ложь). len - i - это способ указать обратное число (в основном он начинает устанавливать нули слева и работает вправо в зависимости от значения i) l oop начинается с 1, потому что вы устанавливаете бит на 0 в любом случае и предотвращает сбой программы, когда len равно 16 -

0 голосов
/ 04 августа 2020

Если вы хотите использовать std::bitset, вы можете воспользоваться преимуществами битовых функций, таких как сдвиг и XOR. В этом решении у меня есть базовый битовый набор всех единиц, маска, которая сдвигается вправо, и я выводю 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...