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

C++ 用c+编码/解码数据+;使用编码器/解码器逻辑门规则,c++,encoding,compression,bit,C++,Encoding,Compression,Bit,有没有一种方法可以通过模拟编码器(或解码器)逻辑门来处理c++中的位(c也可以!) 例如:将一个字节(8位)仅编码为3位,或将一个字(16位)仅编码为4位,反之亦然。这正是编码器和解码器逻辑门实现的方式 这项工作的目标是数据压缩(我知道有更好的方法,但这只是过程的一个阶段,为了项目目的,必须以这种方式完成) 编码器逻辑门: Q= 4 * ((D & 0xF0) != 0) + 2 * ((D & 0x66) != 0) + ((D & 0xAA) != 0); D =

有没有一种方法可以通过模拟编码器(或解码器)逻辑门来处理c++中的位(c也可以!)

例如:将一个字节(8位)仅编码为3位,或将一个字(16位)仅编码为4位,反之亦然。这正是编码器和解码器逻辑门实现的方式

这项工作的目标是数据压缩(我知道有更好的方法,但这只是过程的一个阶段,为了项目目的,必须以这种方式完成)

编码器逻辑门:

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

解码器逻辑门:

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


注意:这可以用位运算符完成,但我需要一种非常快速有效的方法,以便每秒完成数十亿次

如果将位打包为字节

编码器:

Q= 4 * ((D & 0xF0) != 0) + 2 * ((D & 0x66) != 0) + ((D & 0xAA) != 0);
D = 1 << Q;
解码器:

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

如果以字节为单位打包位

编码器:

Q= 4 * ((D & 0xF0) != 0) + 2 * ((D & 0x66) != 0) + ((D & 0xAA) != 0);
D = 1 << Q;
解码器:

Q= 4 * ((D & 0xF0) != 0) + 2 * ((D & 0x66) != 0) + ((D & 0xAA) != 0);
D = 1 << Q;
它可以用位运算符完成,但我需要一个非常快速有效的

由于您的输入非常有限,即8位,因此我会选择查找表。该表可以基于向量(或简单数组)

const uint8\u t非法值=0xff;
std::矢量编码器_表(256,非法_值);
编码器_表[1]=0;
编码器_表[2]=1;
编码器_表[4]=2;
编码器_表[8]=3;
编码器_表[16]=4;
编码器_表[32]=5;
编码器_表[64]=6;
编码器_表[128]=7;
//编码:
uint8\u t D=一个热值;
uint8_t Q=编码器_表[D];
表的相关部分很可能一直保留在1级缓存中,因此性能应该相当好

对于解码,我希望简单的位移位是最有效的解决方案

// Decode:
uint8_t D = 1 << Q;
//解码:
uint8\u t D=1
它可以用位运算符完成,但我需要一个非常快速有效的

由于您的输入非常有限,即8位,因此我会选择查找表。该表可以基于向量(或简单数组)

const uint8\u t非法值=0xff;
std::矢量编码器_表(256,非法_值);
编码器_表[1]=0;
编码器_表[2]=1;
编码器_表[4]=2;
编码器_表[8]=3;
编码器_表[16]=4;
编码器_表[32]=5;
编码器_表[64]=6;
编码器_表[128]=7;
//编码:
uint8\u t D=一个热值;
uint8_t Q=编码器_表[D];
表的相关部分很可能一直保留在1级缓存中,因此性能应该相当好

对于解码,我希望简单的位移位是最有效的解决方案

// Decode:
uint8_t D = 1 << Q;
//解码:

UTI88T D=1查看<代码> STD::向量,它是位集的一种特殊表示。好的,既有又没有。C++有位操作和位字段,所以“是的,逻辑可以实现”,但是不能节省3位。在内存中,你必须至少使用8位,这样你就不会真正获得任何东西。所以,“不,”不是真的“@Botje效率方面呢?我在文章末尾加了一个小便条,读了之后,请不要在事后添加要求@YvesDaoust的实现是10条指令。假设每个周期有一条指令,这将在单个内核上每秒产生数亿次调用。如果你真的需要达到这一目标,你要么需要使用多核并消耗协调/内存开销,要么切换到SIMD并消耗额外的复杂性。“每秒执行数十亿次”——根据问题中显示的知识,这是一个相当不现实的目标。特别是如果你想做一些实际的事情,比如说,给一些有意义的数据,而不是把它们扔掉,看看C++的代码> STD::向量< /代码>,它是一个比特集的专门表示。“是的,这种逻辑可以实现`但你不能只保存3位。你总是需要在内存中使用至少8位,这样你就不会真正获得任何东西。所以“不,不是真的”。@Botje效率方面呢?我在文章末尾加了一个小便条,读了之后,请不要在事后添加要求@YvesDaoust的实现是10条指令。假设每个周期有一条指令,这将在单个内核上每秒产生数亿次调用。如果你真的需要达到这一目标,你要么需要使用多核并消耗协调/内存开销,要么切换到SIMD并消耗额外的复杂性。“每秒执行数十亿次”——根据问题中显示的知识,这是一个相当不现实的目标。特别是如果你想做一些实际的事情,比如输入一些有意义的数据,并用结果做一些事情,而不是把它们扔掉。谢谢你的帮助:)我已经知道按位运算符了,但是这种方法是否足够有效,可以实现我在文章末尾添加的注释?@MuhammadNihad:mh,请随意改进解码器。谢谢你的帮助:)我已经知道逐位运算符,但是这种方法是否足够有效,可以实现我在文章末尾添加的注释?@MuhammadNihad:mh,请随意改进解码器。为什么是向量,而不是
std::array
?我认为后者可以是
constepr
,FTW。为什么是向量,而不是
std::array
?我认为后者可以是
constexpr
,FTW。