Можно ли переписать мой код с использованием алгоритмов STL? - PullRequest
0 голосов
/ 19 января 2020

У меня есть вложенное l oop, и я надеюсь переписать его с использованием алгоритмов STL. Кто-нибудь может мне помочь?

std::bitset<array_size * 8> bitset {};
short bitsetIndex {0};
for (int i = 0; i < array_size; ++i) {
    std::bitset<8> cBitset { (unsigned char) charArray[i] };
    for (int i = 0; i < cBitset.size(); ++i) {
        if(cBitset.test(i)) {
            bitset.set(bitsetIndex);
        }
        bitsetIndex++;
    }
}
return bitset;

1 Ответ

1 голос
/ 19 января 2020

Похоже, вы хотите представить charArray как набор битов. Простое l oop и пара битовых операций выполнят эту работу:

using Bitset = std::bitset<array_size * 8>;
Bitset bitset;
for (auto i = array_size; i > 0; --i) {
    bitset <<= 8;
    bitset |= Bitset(static_cast<unsigned char>(charArray[i - 1]));
}
return bitset;

В зависимости от значения charArray, l oop также можно переписать с помощью итераторов:

using Bitset = std::bitset<array_size * 8>;
Bitset bitset;
for (auto it = std::rbegin(charArray); it != std::rend(charArray); ++it) {
    bitset <<= 8;
    bitset |= Bitset(static_cast<unsigned char>(*it));
}
return bitset;

Наконец, если вы действительно хотите использовать какой-нибудь стандартный библиотечный алгоритм, вы можете использовать std::accumulate:

using Bitset = std::bitset<array_size * 8>;
return std::accumulate(std::rbegin(charArray), std::rend(charArray), Bitset{}, 
    [](Bitset bs, auto ch) { return (bs << 8) | 
        std::bitset<array_size * 8>(static_cast<unsigned char>(ch));
});

Демо

...