2013-07-25 49 views
8

Tôi có một số std::bitset và kiểu bitet cũng cung cấp phương thức to_ulong để dịch bitet thành một số, vấn đề của tôi là dịch bitet thành một số trong khi chỉ xem xét một dãy trong bitet đó, tôi cần phải thực hiện chức năng powerof2 của riêng mình hoặc có một cái gì đó với một cách tiếp cận tiêu chuẩn hơn?Làm thế nào để chuyển đổi một tập hợp con của các bit trong một bitmap C++ thành một số?

Trả lời

5

Bạn có thể thả các bit không cần thiết như

#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 với sản lượng.

+0

@ user2485710 tôi thực hiện một số sai lầm trong phiên bản gốc. Cái này được kiểm tra, xem ví dụ trực tiếp. – TemplateRex

+0

chờ đợi, không làm việc cho tôi, trong trường hợp này http://ideone.com/RNJXNH chương trình của tôi nên in 15, nó in 120 vì nó không thả các bit ngoài cùng bên phải ... – user2485710

+0

@ user2485710 bits [3, 7) * như một tập hợp con của [0,32) * đại diện cho 120, nếu bạn có quyền thêm 3 bit khác, bạn nhận được 15. Nếu đó là hành vi bạn muốn, chỉ cần thay đổi câu lệnh cuối cùng thành: 'b >> = (num - l + r); ' – TemplateRex

1

Bạn có thể sử dụng string như lưu trữ trung gian:

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; 

Prints:

 
11 
3 
+0

rất hay để có các tùy chọn, nhưng tôi nghĩ rằng điều này tạo ra các biến tạm thời không cần thiết. Tôi cần phải thu nhỏ các bước của mình thành một số rất nhỏ. – user2485710

Các vấn đề liên quan