Algorithm 快速位置换

Algorithm 快速位置换,algorithm,Algorithm,我需要存储和应用16位整数的置换。我提出的最佳解决方案是将排列存储为64位整数,其中每4位对应于第I位的新位置,应用程序如下所示: int16 permute(int16 bits, int64 perm) { int16 result = 0; for(int i = 0; i < 16; ++i) result |= ((bits >> i) & 1) * (1 << int( (perm >> (i*4))&

我需要存储和应用16位整数的置换。我提出的最佳解决方案是将排列存储为64位整数,其中每4位对应于第I位的新位置,应用程序如下所示:

int16 permute(int16 bits, int64 perm)
{
   int16 result = 0;
   for(int i = 0; i < 16; ++i)
      result |= ((bits >> i) & 1) * (1 << int( (perm >> (i*4))&0xf ));
   return result;
}
int16置换(int16位,int64置换)
{
int16结果=0;
对于(int i=0;i<16;++i)
结果|=((位>>i)&1)*(1>(i*4))&0xf);
返回结果;
}

有没有更快的方法?谢谢。

还有其他选择

任何置换都可以由a处理,并编码为作为多路复用器输入的掩码,以应用洗牌。这也可以在软件中合理有效地完成(不是很好,但还行),它只是一堆蝴蝶排列。掩模的计算有点棘手,但应用起来可能比单独移动每一个位要快,尽管这取决于要处理的位数,而16位并不是很多

一些较小类别的洗牌可以由更简单(更快)的网络处理,您也可以在该页面上找到


最后,在实践中,在现代x86硬件上,有一个高度通用的
pshufb
函数,它可以在一个周期内(通常)对16个字节应用置换(但可能包括重复和零)。它是在字节上分配位,但一旦你到了那里,只需要一个
pshufb
来排列,一个
pmovmkb
来将其压缩回16位。

如果你能提供一个稍微宽泛的上下文,这可能会有所帮助。例如,您是否需要在许多不同的位上执行相同的排列(在这种情况下,您可以准备一个查找表)或按顺序多次应用相同的排列(在这种情况下,您可以使用循环分解)。通常,我有一个排列列表(最多9个阶乘)它们中的每一个都应用于512个整数的序列(每个整数一次)。所以你的程序有512乘以9的阶乘输出?我想你需要无符号类型。它的实现定义了当1