2009-04-05 55 views
7

Tôi đang cố triển khai thuật toán huffman để nén, đòi hỏi phải viết các bit có độ dài biến đổi cho một tệp. Có cách nào trong C++ để ghi dữ liệu độ dài biến đổi với độ chi tiết 1 bit cho một tệp không?mã hóa huffman

Trả lời

9

Không, lượng dữ liệu nhỏ nhất bạn có thể ghi vào một tệp là một byte.

Bạn có thể sử dụng bitset để thao tác bit dễ dàng hơn, sau đó sử dụng ofstream để ghi vào tệp. Nếu bạn không muốn sử dụng bitet, bạn có thể sử dụng bitwise operators để thao tác dữ liệu của mình trước khi lưu.

3

Số bit nhỏ nhất bạn có thể truy cập và lưu là 8 = 1 byte. Bạn có thể truy cập bit bằng byte sử dụng toán tử bit^& |.

Bạn có thể thiết lập bit n'th tới 1 sử dụng:

my_byte = my_byte | (1 << n); 

trong đó n là từ 0 đến 7.

Bạn có thể thiết lập bit n'th 0 sử dụng:

my_byte = my_byte & ((~1) << n); 

Bạn có thể chuyển đổi bit n'th bằng cách sử dụng:

my_byte = my_byte^(1 << n); 

Chi tiết khác here.

2

Câu trả lời của klew có lẽ là câu trả lời bạn muốn, nhưng chỉ để thêm vào thứ mà Bill cho biết, thư viện Boost có số dynamic_bitset mà tôi thấy hữu ích trong một tình huống tương tự.

1

No. Bạn sẽ phải đóng gói byte. Theo đó, bạn sẽ cần một tiêu đề trong tệp của bạn xác định có bao nhiêu phần tử trong tệp của bạn, bởi vì bạn có khả năng có các bit cuối không được sử dụng.

+0

bạn không cần phải tính số lượng phần tử của tệp là ký tự đặc biệt eof có thể phù hợp với hóa đơn –

2

Tất cả thông tin bạn cần về chút twiddling là ở đây:
How do you set, clear, and toggle a single bit?

Nhưng đối tượng nhỏ nhất mà bạn có thể đưa vào một tập tin là một byte.
Tôi sẽ sử dụng dynamic_bitset và mỗi khi kích thước lớn hơn 8 trích xuất 8 bit dưới cùng thành một char và ghi nó vào một tệp, sau đó chuyển các bit còn lại xuống 8 vị trí (lặp lại).