Trong C, Tôi có một từ 32 bit đại diện cho một địa chỉ (và tôi có nó được lưu trữ trong một unsigned long, hy vọng đó là ok). Bây giờ từ những gì tôi thu thập, một phần của một địa chỉ chứa số trang và phần còn lại chứa phần bù. Tôi đã tự hỏi làm thế nào tôi có thể trích xuất chỉ là các bit cung cấp cho tôi số trang. Tôi đã làm việc ra 22 bit quan trọng nhất đầu tiên là số trang và 10 bit khác là bù đắp trang. Làm thế nào tôi có thể lấy các bit là số trang? Tôi nghĩ rằng tôi có thể làm điều này với một số hoạt động bitwise, nhưng tôi không chắc chắn như thế nào.Trích xuất các bit
Trả lời
Sử dụng các toán tử bitshift để trích xuất các bit bạn cần.
pageNumber = x >> 10;
offset = x & ((1 << 10) - 1);
Đối với số trang, toán tử >> chuyển bit xuống, vì vậy bạn sẽ mất ít bit có dấu hiệu nhất.
Để bù, ((< < 10) - 1) tạo bitmask bao gồm 10 bit được sử dụng để chỉ chọn 10 bit quan trọng nhất và bỏ qua các bit quan trọng nhất.
Nó có thể là một ý tưởng tốt về mã như thế này để che giấu các bit sau khi bạn chuyển chúng, trong trường hợp phần cứng của bạn thực hiện một phép tính số học (dấu mở rộng). pagenumber = (x >> 10) & ((1 << 22) - 1); –
Tôi là một fan hâm mộ lớn của phương pháp "hai ca" của lĩnh vực khai thác. Nó hoạt động cả chữ ký và unsigned. Để trích xuất một lĩnh vực rộng w
với ít nhất đáng kể chút lsb
từ word
:
#define BITSIN(W) (8*sizeof(W))
return (word << (BITSIN(word) - (lsb+width))) >> (BITSIN(word) - width);
Trong trường hợp này, BITSIN(word) == 32
và lsb+width == 32
, do đó, miễn là từ trong câu hỏi là unsigned, bạn chỉ có thể thay đổi ngay 10 mà không cần che.
Một cảnh báo: hãy cẩn thận thay đổi 32 bit trên các loại 32 bit! Chuẩn C cho phép trình biên dịch làm bất cứ điều gì và những gì các chip Intel thường làm không hữu ích: x << y
ca x
còn lại bởi y % 32
bit (được cung cấp x
có loại số nguyên 32 bit). Điều này có nghĩa là nếu bạn cố chuyển một số nguyên 32 bit sang trái hoặc sang phải 32 bit, kết quả sẽ giống như một số không. Có một vấn đề tương tự với sự thay đổi 64 bit của các loại 64 bit.
"những gì các chip Intel phổ biến làm là không hữu ích" - họ làm gì? – AShelly
@ASHelly: câu hỏi hay; Tôi đã chỉnh sửa câu trả lời. Ai biết, nó có thể giúp tôi có một upvote :-) –
- 1. bit trích xuất trong số nguyên Ruby
- 2. Trích xuất các bit N ở cùng bên phải của số nguyên
- 3. Trích xuất chuỗi từ giữa các trích dẫn
- 4. trích xuất các từ từ một tệp
- 5. Trích xuất các tham số mẫu C++
- 6. trích xuất các giá trị từ HashMap
- 7. Trích xuất các lỗi chuẩn từ glm
- 8. Trích xuất các bản chất trong Go
- 9. Các giá trị trích xuất được trích xuất trong kết hợp mẫu?
- 10. Trích xuất luồng Python
- 11. Bất kỳ cách nào thông minh hơn để trích xuất từ mảng bit?
- 12. Perl: Làm thế nào để trích xuất các bit nhất định từ một byte và sau đó bí mật các bit này thành giá trị hex?
- 13. Trích xuất SSE xáo trộn giá trị 32 bit chỉ với SSE2
- 14. Trích xuất ISO 7zip
- 15. Trích xuất các chữ số từ phao C++
- 16. Perl: Cho một chuỗi tùy ý, làm thế nào để bạn trích xuất các bit N đầu tiên?
- 17. Trích xuất các chuỗi từ các lớp Java
- 18. gettext: trích xuất các chuỗi dgettext() thành các tệp domain.po
- 19. Trích xuất EXIF từ JPEG
- 20. Trích xuất văn bản Itextsharp
- 21. cách trích xuất từ dispatch.json.JsObject
- 22. Trích xuất Blob trong OpenCV
- 23. Trích xuất bảng từ DOCX
- 24. Trích xuất URL từ chuỗi
- 25. Trích xuất thông tin từ $?
- 26. Trích xuất chuỗi số nguyên
- 27. Trích xuất các danh từ và động từ văn bản
- 28. Trích xuất các tệp đính kèm e-mail trên Unix
- 29. trích xuất văn bản từ tex, xóa các thẻ latex
- 30. Trích xuất tính năng từ các mạng thần kinh
Câu hỏi hay - Tôi cần làm điều này cho một bộ tách rời mà tôi đang viết. – new123456