2013-07-25 16 views

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.

+0

user2485710 @ orijinal versiyonunda bazı hatalar yaptı. Bu test edildi, canlı örneğe bakın. – TemplateRex

+0

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

+0

@ 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

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

İlgili konular