std::bitset
'um var ve bitset türü, bitset'i bir sayıya çevirmek için to_ulong
yöntemini de sağlar, benim problemim, bitset'te bir aralık düşünürken bitset'i bir sayıya çevirmekle ilgili, kendi powerof2 işlevimi uygulamam gerekiyor ya da daha standart bir yaklaşıma sahip bir şey var mı?Bir C++ bitsetindeki bitlerin bir aralık alt kümesini bir sayıya nasıl dönüştürürüm?
8
A
cevap
5
Sen çıkışı ile
#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 gibi gereksiz bit bırakabilirsiniz.
1
Sen ara birikim olarak string
kullanabilirsiniz:
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;
Baskılar:
11 3
+0
seçenekleri olması güzel, ama bunun gereksiz geçici değişkenler oluşturduğunu düşünüyorum. Adımlarımı çok küçük bir sayıyla küçültmem gerekiyor. – user2485710
user2485710 @ orijinal versiyonunda bazı hatalar yaptı. Bu test edildi, canlı örneğe bakın. – TemplateRex
bekle, benim için çalışmıyor, bu durumda http://ideone.com/RNJXNH programım 15 basmalı, 120 bit yazdırıyor çünkü en sağdaki bitleri düşürmez ... – user2485710
@ user2485710 bit [3, 7) * [0,32] 'nin bir alt kümesi olarak * 120'yi temsil eder, eğer 3 biti deşifre ederseniz, 15 alırsınız. İstediğiniz davranışsa, aşağıdaki ifadeyi değiştirin: 'b >> = (num) - l + r); – TemplateRex