【问题标题】:Encoding/Decoding data in c++ using encoder/decoder logic gate rules [closed]使用编码器/解码器逻辑门规则在 C++ 中编码/解码数据 [关闭]
【发布时间】:2019-09-27 10:18:44
【问题描述】:

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

例如:将一个字节(8 位)编码为 3 位,或将一个字(16 位)编码为 4 位,反之亦然。就像编码器和解码器逻辑门一样。

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

编码器逻辑门:

解码器逻辑门:

注意:可以使用按位运算符完成,但我需要一种非常快速有效的方法,这样我才能做到数十亿次同行秒!

【问题讨论】:

  • 看看std::vector<bool>,它是一个bitset的特殊表示。
  • 嗯,有和没有。 C++ 具有逐位操作和位域,所以“是的,可以实现该逻辑”,但你不能只保存 3 位。你总是必须在内存中使用至少 8 位,所以你不会真正获得任何东西。所以“不,不是真的”。
  • @Botje 效率方面呢?我在文章末尾加了一点注释,请阅读它,请
  • 请不要在事后添加要求。 @YvesDaoust 的实现是 10 条指令。假设每个周期有 1 条指令,这将在单个内核上每秒产生数亿次调用。如果您确实需要达到该目标,您将需要使用多个内核并吃掉协调/内存开销,或者切换到 SIMD 并吃掉额外的复杂性。
  • “数十亿次同行秒”——基于问题中显示的知识,这是一个相当不切实际的目标。尤其是如果你想做一些实际的事情,即输入一些有意义的数据,并对结果做一些事情,而不是把它们扔掉。

标签: c++ encoding compression bit


【解决方案1】:

如果你把比特打包成字节,

编码器:

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

【讨论】:

  • 感谢您的帮助 :) 我已经知道按位运算符,但是这种方式是否足以实现我在帖子末尾添加的注释?
  • @MuhammadNihad:嗯,请随时改进解码器。
【解决方案2】:

它可以用按位运算符完成,但我需要一个非常快速和高效的

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

const uint8_t illegal_value = 0xff;
std::vector<uint8_t> encoder_table(256, illegal_value);
encoder_table[1] = 0;
encoder_table[2] = 1;
encoder_table[4] = 2;
encoder_table[8] = 3;
encoder_table[16] = 4;
encoder_table[32] = 5;
encoder_table[64] = 6;
encoder_table[128] = 7;

// Encode:
uint8_t D = a_one_hot_value;
uint8_t Q = encoder_table[D];

表的相关部分很可能一直停留在一级缓存中,因此性能应该相当不错。

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

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

但可以尝试使用表格进行比较。该表将只需要 8 个条目。又是一些可以在 1 级缓存中的小东西。

【讨论】:

  • 为什么是向量,而不是std::array?我认为后者可以做成constexpr, FTW。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多