Как преобразовать подмножество диапазона битов в наборе битов C++ в число?

У меня есть std::bitset и тип набора битов также обеспечивает to_ulong метод преобразования набора битов в число, моя проблема состоит в том, чтобы преобразовать набор битов в число, при этом, просто учитывая диапазон в этом наборе битов, мне нужно реализовать собственную функцию powerof2, или есть что-то с более стандартным подходом?

2 ответа

Решение

Вы можете отбросить ненужные биты, такие как

#include <bitset>
#include <iostream>

// drop bits outside the range [R, L) == [R, L - 1]
template<std::size_t R, std::size_t L, std::size_t N>
std::bitset<N> project_range(std::bitset<N> b)
{
    static_assert(R <= L && L <= N, "invalid bitrange");
    b >>= R;            // drop R rightmost bits
    b <<= (N - L + R);  // drop L-1 leftmost bits
    b >>= (N - L);      // shift back into place
    return b;
}

int main()
{
    std::bitset<8> b2(42); // [0,0,1,0,1,0,1,0]
    std::cout << project_range<0,8>(b2).to_ulong() << "\n"; // 42 == entire bitset
    std::cout << project_range<2,5>(b2).to_ulong() << "\n"; // 8, only middle bit
}

Живой пример с выходом.

Ты можешь использовать string в качестве промежуточного хранилища:

bitset<32> bs (string("1011"));
cout << bs.to_ullong() << endl;

// take a range - 2 last bits in this case
string s = bs.to_string().substr(bs.size() - 2);  

bitset<32> bs1 (s);
cout << bs1.to_ullong() << endl;

Печать:

11
3
Другие вопросы по тегам