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ố?
8
A
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.
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
- 1. Làm thế nào để chuyển một tập hợp con của tập hợp sang phương thức C#?
- 2. Làm thế nào để chuyển đổi một tập hợp con DataFrame của các cột AND hàng thành một mảng numpy?
- 3. Làm thế nào để chuyển đổi một byte thành bit?
- 4. Làm thế nào để bạn chuyển đổi một mảng byte thành một thể hiện Bitmap (.NET)?
- 5. Làm thế nào để chuyển đổi một OpenCV IplImage 8-bit * thành IplImage 32-bit *?
- 6. Làm thế nào để chuyển đổi một số thập phân thành một int trong C#?
- 7. Làm thế nào để chuyển đổi một số nguyên thành một chuỗi một cách dễ dàng?
- 8. C - làm thế nào để chuyển đổi một con trỏ trong một mảng thành một chỉ mục?
- 9. Làm thế nào để chuyển đổi một số nguyên 128-bit thành chuỗi ascii thập phân trong C?
- 10. Làm thế nào để chuyển đổi một chuỗi các số thành một dãy số?
- 11. Chuyển đổi một tập hợp các cột trong một data.table
- 12. Làm thế nào tôi có thể chuyển đổi một Bitmap thành một Uri?
- 13. cách chuyển đổi hai byte thành một số 16 bit?
- 14. Làm thế nào để chuyển đổi một Bitmap thành Drawable trong Android?
- 15. Làm thế nào để chuyển đổi một chuỗi đại diện của một số thành một số trong coldfusion?
- 16. Chuyển đổi số nguyên thành một bit đại diện
- 17. Matlab, làm thế nào để chuyển đổi một chuỗi các số nguyên thành một vectơ?
- 18. Làm thế nào để chuyển đổi một số ("") thành Không có trong một dòng?
- 19. Làm thế nào để trừ một bitmap từ một bitmap khác trong C# /. NET?
- 20. Làm thế nào để chuyển đổi chuỗi số thành số nguyên trong một danh sách?
- 21. Làm thế nào để khởi chạy một tiến trình con trong C# với một argv? (Hoặc chuyển đổi agrv thành một chuỗi arg hợp pháp)
- 22. Làm thế nào để chuyển đổi Bitmap thành chuỗi Base64?
- 23. Chuyển đổi biểu diễn chuỗi các bit thành một byte
- 24. Làm thế nào để chuyển đổi một giá trị unichar thành một NSString trong Objective-C?
- 25. Làm thế nào để tạo ra một hàm chuyển đổi một số thành Hexavigesimal tính từ?
- 26. Làm thế nào để chuyển đổi tất cả nội dung trong một scrollview sang một bitmap?
- 27. Làm thế nào để chuyển đổi một hình ảnh drawable từ nguồn lực để một Bitmap
- 28. Làm thế nào để chuyển đổi một chuỗi số clojure thành các số nguyên riêng biệt?
- 29. Làm thế nào để chuyển đổi một chuỗi thành một hằng số trong Ruby?
- 30. Trong kịch bản shell bash làm thế nào để chuyển đổi một chuỗi thành một số
@ 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
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
@ 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