首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 儲存 2-bit 資料:std::bitset 或位元運算

     編輯:程式設計疑難解答

哈夫曼編碼產生的前綴碼長度不一(如 2 bit),需緊湊儲存以達到真正壓縮。

方案一:std::bitset(固定長度)

#include <bitset>
std::bitset<1000000> bits; // 編譯期常數大小
bits[pos] = 1; // 讀寫單一 bit

優點:API 簡單、自動處理跨字節。缺點:大小必須編譯期確定。

方案二:動態位元向量(vector<unsigned long>)

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;
    }
};

方案三:Boost.DynamicBitset

#include <boost/dynamic_bitset.hpp>
boost::dynamic_bitset<> bits(1000000);
bits[123] = 1;

寫入檔案

將 vector<uint64_t> 直接 fwrite 或 ofstream.write,讀取時反向操作。

核心概念:**位元級存取 = 索引/64 定位字節,索引%64 定位位元**,用位元運算(|、&、~、<<)完成讀寫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved