2014-10-11 19 views
5

Tôi đang chuyển một số mã bắt buộc cho Haskell. Mục tiêu của tôi là phân tích một tệp thực thi, do đó mỗi byte của phần văn bản được gán một số cờ, tất cả đều phù hợp trong một byte (6 bit chính xác).Cấu trúc dữ liệu nào cho một mảng cờ bit?

Trong ngôn ngữ như C, tôi sẽ chỉ phân bổ một mảng byte, không cho chúng và cập nhật chúng khi tôi đi. Làm thế nào tôi sẽ làm điều này một cách hiệu quả trong Haskell?

Nói cách khác: Tôi đang tìm kiếm một ByteString có quyền truy cập bit-khôn ngoan và cập nhật thời gian liên tục khi tôi tháo rời nhiều phần văn bản hơn.

Chỉnh sửa: Tất nhiên, bất kỳ loại cấu trúc dữ liệu nào khác sẽ làm nếu hiệu quả tương tự.

Trả lời

6

Bạn có thể sử dụng véc tơ với bất kỳ loại dữ liệu nào là ví dụ của Bits typeclass, ví dụ: Word64 cho 64 bit trên mỗi phần tử trong vectơ. Sử dụng vectơ không có hộp nếu bạn muốn mảng tiếp giáp trong bộ nhớ.

9

Việc triển khai mảng không được phân loại là Bool -s trong array là một bitarray được đóng gói. Bạn có thể thực hiện các cập nhật có thể thay đổi trên các mảng như vậy trong ST Monad (về cơ bản là hành vi thời gian chạy giống như trong C).

+0

Đây là cả hai câu trả lời tuyệt vời, nhưng tôi nghĩ rằng tôi đi với gspr bởi vì nó có vẻ thành ngữ hơn với tôi. –

+0

@Sebastian: 'vector' không gói Bool-s thành bit, do đó bạn phải viết trình bao bọc của riêng mình nếu bạn muốn đọc/ghi các bit cụ thể. Hầu hết thời gian 'vector' là một lựa chọn tốt hơn vì API phong phú hơn, nhưng ở đây' mảng' có lẽ đơn giản hơn. –

+1

Tôi nghĩ rằng tôi sẽ phân bổ một byte cho mỗi phần tử, bởi vì tôi nghĩ * sẽ có hiệu suất cao hơn từ phối cảnh truy cập phần tử. Ngoài ra nó cảm thấy như thực hiện cờ của tôi trên đầu trang của 'Bits' là bằng cách nào đó thuận tiện hơn 6 Bool' liên tiếp, tuy nhiên đó có thể là chủ quan. –

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