Kể từ khi bạn đề cập đến C cũng như C++, tôi sẽ giả định rằng một C++ - định hướng giải pháp như boost::dynamic_bitset
có thể không được áp dụng, và nói về việc thực hiện C ở mức độ thấp thay thế. Lưu ý rằng nếu một cái gì đó như boost::dynamic_bitset
hoạt động cho bạn hoặc có một thư viện C đã tồn tại từ trước, bạn có thể tìm thấy chúng, sau đó sử dụng chúng có thể tốt hơn là cuộn của riêng bạn.
Cảnh báo: Không có mã nào sau đây đã được thử nghiệm hoặc thậm chí được biên soạn, nhưng nó phải rất gần với những gì bạn cần.
Để bắt đầu, giả sử bạn có một bitset kích thước N. cố định Sau đó, một cái gì đó giống như các công việc sau:
typedef uint32_t word_t;
enum { WORD_SIZE = sizeof(word_t) * 8 };
word_t data[N/32 + 1];
inline int bindex(int b) { return b/WORD_SIZE; }
inline int boffset(int b) { return b % WORD_SIZE; }
void set_bit(int b) {
data[bindex(b)] |= 1 << (boffset(b));
}
void clear_bit(int b) {
data[bindex(b)] &= ~(1 << (boffset(b)));
}
int get_bit(int b) {
return data[bindex(b)] & (1 << (boffset(b));
}
void clear_all() { /* set all elements of data to zero */ }
void set_all() { /* set all elements of data to one */ }
Theo văn bản, đây là một chút dầu thô kể từ khi nó thực hiện chỉ một bitset toàn cầu duy nhất với một kích thước cố định . Để giải quyết những vấn đề này, bạn muốn bắt đầu với một dữ liệu có cấu trúc như sau:
struct bitset { word_t *words; int nwords; };
và sau đó viết các chức năng để tạo và hủy các bit này.
struct bitset *bitset_alloc(int nbits) {
struct bitset *bitset = malloc(sizeof(*bitset));
bitset->nwords = (n/WORD_SIZE + 1);
bitset->words = malloc(sizeof(*bitset->words) * bitset->nwords);
bitset_clear(bitset);
return bitset;
}
void bitset_free(struct bitset *bitset) {
free(bitset->words);
free(bitset);
}
Bây giờ, việc sửa đổi các chức năng trước đó để tham số struct bitset *
là khá đơn giản. Vẫn không có cách nào để tái kích thước một bitet trong suốt cuộc đời của nó, cũng không có kiểm tra giới hạn nào, nhưng cũng không khó để thêm vào thời điểm này.
Nguồn
2010-04-13 22:13:28
Tôi không hoàn toàn chắc chắn những gì bạn có nghĩa là khi bạn nói rằng một "thường xuyên int/char bitmask" không phải là rất sạch khi chiều dài mảng lớn hơn độ dài kiểu dữ liệu? Tôi đã đăng một thực thi C bitset truyền thống bên dưới, vì tôi giải thích yêu cầu của bạn về một giải pháp C/C++ và câu lệnh của bạn rằng 'std :: vector' không có sẵn để chỉ ra rằng bạn có thể cần một giải pháp C thẳng. –