Ich habe eine std::bitset
und der Bitset-Typ bietet auch eine to_ulong
-Methode, um das Bitset in eine Zahl zu übersetzen, mein Problem ist über das Bitset in eine Zahl zu übersetzen, nur einen Bereich in diesem Bitset berücksichtigen, muss ich meine eigene Powerof2-Funktion implementieren oder gibt es etwas mit einem Standardansatz?Wie konvertiert man eine Bereichsuntermenge von Bits in einem C++ - Bitset in eine Zahl?
8
A
Antwort
5
Sie können die unnötigen Bits wie
#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 mit Ausgang fallen.
1
Sie können string
als Zwischenspeicher verwenden:
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;
Drucke:
11 3
+0
nice Optionen zu haben, aber ich denke, dass dies unnötige temporäre Variablen erstellt. Ich muss meine Schritte auf eine sehr kleine Zahl reduzieren. – user2485710
@ user2485710 machte ich einige Fehler in der Originalversion. Dieser ist getestet, siehe Live-Beispiel. – TemplateRex
warten, funktioniert nicht für mich, in diesem Fall http://ideone.com/RNJXNH mein Programm sollte 15 drucken, druckt es 120, weil es nicht die am weitesten rechts liegenden Bits fallen lassen ... – user2485710
@ user2485710 Bits [3, 7) * als eine Teilmenge von [0,32) * stellt 120 dar, wenn Sie die anderen 3 Bits rechts verschieben, erhalten Sie 15. Wenn dies das gewünschte Verhalten ist, ändern Sie einfach die letzte Anweisung in: 'b >> = (num - l + r); ' – TemplateRex