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
Powiązane problemy
- 1. w zestawie bitów, czy mogę użyć "to_ulong" dla określonego zakresu bitów?
- 2. manipulacja bitami: usuwanie zakresu bitów
- 3. Konwersja bitów łańcuchowych Erlanga na liczbę całkowitą
- 4. Jak przekonwertować 8 bitów na 16 bitów w VHDL?
- 5. Przesunięcie bitów w lewo i odrzucenie bitów
- 6. Projektowanie strumienia bitów w C#
- 7. Ustawienie bitów w Ansi C
- 8. Wyczyść dolne 16 bitów
- 9. Nadpisywanie zakresu bitów w liczbie całkowitej w sposób ogólny
- 10. Rozmiar woluminu 8 bitów lub 16 bitów?
- 11. C++ pola bitów i -Wconversion
- 12. Metaprogram do zliczania bitów
- 13. Kopiowanie bitów od ulong na długie w C#
- 14. $ rozmiar, $ bitów, verilog
- 15. JavaScript - konwersja liczby całkowitej na tablicę bitów
- 16. Jak zaimplementować tablicę bitów w C/Objective C
- 17. Jak definiować i pracować z tablicą bitów w C?
- 18. algorytm za generowaniem tabeli wyszukiwania bitów wstecznych (8 bitów)
- 19. Pobieranie bitów z SqlServer do C#
- 20. bitów maskowania Pythona
- 21. Liczba bitów reprezentujących liczby ujemne
- 22. Przesuwanie zestawu bitów Java
- 23. 7-bitów do 0xEF
- 24. Ile bitów ma postać?
- 25. Porównanie bitowe bitów w Javie
- 26. Bitowe obliczanie i detekcja bitów
- 27. Precyzyjna kontrola bitów tekstur w GLSL
- 28. Jak utworzyć tablicę bitów w Pythonie?
- 29. Jak utworzyć tablicę bitów w JavaScript?
- 30. Konwersja równań na operacje zmiany bitów
@ 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