2009-11-29 42 views
5

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

+0

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

Trả lời

11

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.

+1

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); –

2

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) == 32lsb+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.

+0

"những gì các chip Intel phổ biến làm là không hữu ích" - họ làm gì? – AShelly

+0

@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 :-) –

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