c++ - 使用编码器/解码器逻辑门规则在 C++ 中编码/解码数据

标签 c++ encoding compression bit

<分区>

有没有办法以模拟编码器(或解码器)逻辑门的方式处理 C++ 中的位(C 也可以!)?

例如:将一个字节(8 位)编码为仅 3 位,或将一个字(16 位)仅编码为 4 位,反之亦然。完全按照编码器和解码器逻辑门的方式。

这样做的目的是数据压缩(我知道有更好的方法,但这是过程的一个阶段,出于项目目的必须以这种方式完成)

编码器逻辑门:

Encoder Logic gate

解码器逻辑门:

Decoder Logic gate

注意:它可以通过按位运算符来完成,但我需要一种非常非常快速和高效的方法,这样我才能以对等秒的方式完成数十亿次!

最佳答案

如果以字节为单位打包这些位,

编码器:

Q= 4 * ((D & 0xF0) != 0) + 2 * ((D & 0x66) != 0) + ((D & 0xAA) != 0);

解码器:

D = 1 << Q;

如果你想要一个更快的编码器,

byte QTable[]= {
  0, 0, 3, 3, 2, 2, 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, 
  4, 4, 7, 7, 6, 6, 7, 7, 5, 5, 7, 7, 7, 7, 7, 7, 
  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  6, 6, 7, 7, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  6, 6, 7, 7, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  5, 5, 7, 7, 7, 7, 7, 7, 5, 5, 7, 7, 7, 7, 7, 7, 
  5, 5, 7, 7, 7, 7, 7, 7, 5, 5, 7, 7, 7, 7, 7, 7, 
  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
};

Q= QTable[D];

关于c++ - 使用编码器/解码器逻辑门规则在 C++ 中编码/解码数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58132567/

相关文章:

c++ - 使用类的 'this' 指针的 boost::intrusive_ptr 构造函数歧义

c++ - 如何将未经预处理的 C/C++ 源代码转换为语法树(并返回)?

linux - 如何grep包含UTF-16或UTF-32编码文件的文件夹?

r - 使用 R 进行序列长度编码

c++ - 返回 PVOID 的模板函数

c++ - 使用 MINLOC 的 OpenMPI Reduce

python - 将listdir()返回的字节转换为字节进行解码

.net - 有没有办法在使用 System.IO.Compression.GZipStream 时设置压缩级别

linux - 试图 tar 一个目录而不是列出目录

compression - 是否有用于 "perfect"压缩的算法?