C++ 如何将C+中的10位映射到6位+;(尽可能高效)?

C++ 如何将C+中的10位映射到6位+;(尽可能高效)?,c++,function,optimization,logic,neural-network,C++,Function,Optimization,Logic,Neural Network,所以我知道在功能上我希望发生什么,我只是不知道让电脑做这件事的最好方法。。。在C++中…< /p> 我想实现一个C++函数,它将一个10位序列映射到6位序列。 不管这些比特现在代表什么。。。有2^10=1024个可能的输入。有2^6=64个不同的输出。可能有很多图案。显然有很多模式。但这很复杂。这是一个已知的映射,只是一个复杂的映射 输出只是64种可能性中的一种。也许他们都不习惯。他们可能不会。但假设他们会 现在,我正在考虑一个四重嵌套switch语句,它只处理1024个案例中的每一个,并处理业

所以我知道在功能上我希望发生什么,我只是不知道让电脑做这件事的最好方法。。。在C++中…< /p>

我想实现一个C++函数,它将一个10位序列映射到6位序列。 不管这些比特现在代表什么。。。有2^10=1024个可能的输入。有2^6=64个不同的输出。可能有很多图案。显然有很多模式。但这很复杂。这是一个已知的映射,只是一个复杂的映射

输出只是64种可能性中的一种。也许他们都不习惯。他们可能不会。但假设他们会

现在,我正在考虑一个四重嵌套switch语句,它只处理1024个案例中的每一个,并处理业务内联,将适当的值分配给指向我传递给这个函数的任何结构的指针。这似乎很幼稚,而且有点慢。并不是说我已经实现了它,但这就是为什么我想先问你

此基本函数(映射)必须在每个语句节点上运行,通常不止一次,以支持系统希望支持的任意多个语句。请问,我如何在C++中尽可能高效地将10位映射到6位?

我知道映射是什么,我知道10位的输入和6位的输出。。。我完全可以硬编码。。。以某种方式多重开关真难看。如何将我的10位映射到6位?!神经网络?记忆松饼?你会怎么做


self注意:这就是为什么我不喜欢查找表的原因。让我们假设所有输入都具有相同的可能性(当然不是,而且可以更有效地排序,但仍然如此),那么检索输出值平均需要数组的512个内存提前量。。。看起来,如果你做一个(全局的,为什么不)二叉树10层深,你覆盖了1024个输入,平均只需10步就可以检索到输出。。。如果有好的模式,可能会少一些。。。给定一个经常运行的确定性函数,如何最好地从已知输入检索已知输出?

我将使用1024个元素的查找表。所以要硬编码并通过索引访问它


这就省去了对大量switch语句的需要,并且可能更具可读性。

我将使用1024个元素的查找表。所以要硬编码并通过索引访问它


这节省了对大量switch语句的需要,并且可能更具可读性。

使用大小为1024的查找表。

使用大小为1024的查找表。

取决于您对效率的定义

  • 省时:查表
  • 节省空间:使用卡诺图

  • 取决于你对效率的定义

  • 省时:查表
  • 节省空间:使用卡诺图
  • 如果需要映射到某些特定的6位值,请在除以16后使用大小为64(不是1024!)的查找表。这将比16倍冗余的1024个条目表更容易装入缓存(而且,右移的2个额外周期远远超过了可能的缓存未命中的成本)

    否则,如果一个简单的序列映射是好的,只需除以16即可

    1024/64=16,所以除以16(启用编译器优化时的右移),映射为6位(按顺序)。它的效率再高不过了。

    如果需要映射到某些特定的6位值,请在除以16后使用大小为64(而不是1024!)的查找表。这将比16倍冗余的1024个条目表更容易装入缓存(而且,右移的2个额外周期远远超过了可能的缓存未命中的成本)

    否则,如果一个简单的序列映射是好的,只需除以16即可


    1024/64=16,所以除以16(启用编译器优化时的右移),映射为6位(按顺序)。它的效率再高不过了。

    仅仅使用&有什么不对。你不能只做
    number&0x3f
    ,它应该只删除第一位。输入的数据类型是什么?如果它只是一个整数,那么查找表就是完美的。如果不是,那么是的,你将不得不进行多达10次的比较。在这种情况下,它的速度可能与大规模切换语句的速度相同。但我无法想象构建一个1024个条目的switch语句需要多长时间……仅仅使用&有什么不对。你不能只做
    number&0x3f
    ,它应该只删除第一位。输入的数据类型是什么?如果它只是一个整数,那么查找表就是完美的。如果不是,那么是的,你将不得不进行多达10次的比较。在这种情况下,它的速度可能与大规模切换语句的速度相同。但我无法想象构建一个1024个条目的switch语句需要多长时间……所以查找表只是一个数组,它将索引[0-1023]映射到一个值[0-63]?我只是让它全球化还是什么?没错。这将是一个全局变量。它可以作为包含1024个元素的
    char
    类型的全局数组来完成。@Jimmy:是的,只要一个数组(char作为元素类型就足够了)。我建议在转换函数中设置为静态函数,或在定义该函数的文件中设置为静态文件。@滚动可能是个问题。我通常接受它(因为我的编辑器支持折叠,所以我可以在那里避免它),但在任何情况下我都不会使它全球化(从另一个翻译单元可以访问的意义上)。如果没有其他问题,我会在一个匿名名称空间中向前声明它,并在文件末尾定义它(从而避免滚动问题)。@Jimmy:最好避免使用全局变量,但是这里我们讨论的是全局常量,这是良好编程的基石。你只需要小心地定义它们在哪里和如何,因为C++没有处理初始化/销毁顺序: