coding passes ->扫雷

发现一个有趣的问题,呵呵,在coding pass扫描每个位平面时,规则和扫雷游戏差不多

这段代码实现了哈夫曼编码的压缩功能,对输入的文件进行编码并输出压缩后的二进制文件。 具体解释见代码注释: ```c++ void HuffmanCoding::encode(ifstream& fIn) { // 初始化变量 unsigned long packCnt = 0, hold, maxPack = bytes * bits, pack = 0; char ch, ch2; int bitsLeft, runLength; // 循环直到读到文件末尾 for (fIn.get(ch); !fIn.eof();) { // 获取重复字符长度 for (runLength = 1, fIn.get(ch2); !fIn.eof() && ch2 == ch; runLength++) fIn.get(ch2); // 根据字符编码获取对应的哈夫曼编码 HuffmanNode* p = chars[(unsigned char)ch]; for (p = chars[(unsigned char)ch]; p != 0 && runLength != p->runLen; p = p->right); if (p == 0) cout<<("A promble in encode()"); // 判断编码是否能够直接放入压缩后的二进制文件 if (p->codewordLen < maxPack - packCnt) { pack = (pack << p->codewordLen) | p->codeword; pack += p->codewordLen; } else { // 将编码拆分为两部分,一部分放入当前二进制文件,另一部分等待下一次输出 bitsLeft = maxPack - packCnt; pack <<= bitsLeft; if (bitsLeft != p->codewordLen) { hold = p->codeword; hold >>= p->codewordLen - bitsLeft; pack |= hold; } else pack |= hold; output(pack); if (bitsLeft != p->codewordLen) { pack = p->codeword; packCnt = maxPack - (p->codewordLen - bitsLeft); packCnt = p->codewordLen - bitsLeft; } else packCnt = 0; } ch = ch2; // 更新当前字符 } // 输出剩余的编码 if (packCnt != 0) { pack <<= maxPack - packCnt; output(pack); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值