哈夫曼編碼產生的前綴碼長度不一(如 2 bit),需緊湊儲存以達到真正壓縮。
#include <bitset>
std::bitset<1000000> bits; // 編譯期常數大小
bits[pos] = 1; // 讀寫單一 bit
優點:API 簡單、自動處理跨字節。缺點:大小必須編譯期確定。
class BitVector {
std::vector<uint64_t> data;
void set(size_t pos, bool val) {
size_t idx = pos >> 6; // /64
size_t offset = pos & 63; // %64
if (val) data[idx] |= (1ULL << offset);
else data[idx] &= ~(1ULL << offset);
}
bool get(size_t pos) {
return (data[pos>>6] >> (pos&63)) & 1;
}
};
#include <boost/dynamic_bitset.hpp>
boost::dynamic_bitset<> bits(1000000);
bits[123] = 1;
將 vector<uint64_t> 直接 fwrite 或 ofstream.write,讀取時反向操作。
核心概念:**位元級存取 = 索引/64 定位字節,索引%64 定位位元**,用位元運算(|、&、~、<<)完成讀寫。