Mam std::bitset
, a typ bitsetu zapewnia również metodę to_ulong
do przetłumaczenia bitsetu na liczbę, mój problem polega na przetłumaczeniu zestawu bitów na liczbę, a biorąc pod uwagę zakres w tym zestawie bitów, muszę zaimplementować moją własną funkcję powerof2 czy jest coś z bardziej standardowym podejściem?Jak skonwertować podzestaw zakresu bitów w zestawie bitów C++ na liczbę?
8
A
Odpowiedz
5
można usunąć niepotrzebne kawałki jak
#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
}
Live example z wyjściem.
1
Można użyć string
jako magazyn pośredni:
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;
Wydruki:
11 3
+0
miło mieć opcje, ale myślę, że to tworzy niepotrzebne zmienne tymczasowe. Muszę zmniejszyć moje kroki do bardzo małej liczby. – user2485710
@ user2485710 zrobiłem kilka błędów w wersji oryginalnej. Ten jest testowany, zobacz przykład na żywo. – TemplateRex
czekaj, nie działa dla mnie, w tym przypadku http://ideone.com/RNJXNH mój program powinien wydrukować 15, drukuje 120, ponieważ nie upuszcza najdokładniejszych bitów ... – user2485710
@ user2485710 bitów [3, 7) * jako podzbiór [0,32) * reprezentuje 120, jeśli cofniesz do 3 bitów, otrzymasz 15. Jeśli takie zachowanie chcesz, po prostu zmień ostatnią instrukcję na: 'b >> = (num - l + r); ' – TemplateRex