我需要存储和应用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;
}
有更快的方法吗?谢谢。
答案 0 :(得分:3)
还有其他选择。
任何排列都可以由Beneš network处理,并编码为作为多路复用器输入以应用shuffle的掩码。这在软件中也可以合理有效地完成(不是很好但是没问题),它只是一堆蝴蝶排列。掩码计算起来有点棘手,但可能比单独移动每个位更快,但这取决于你处理的位数和16位不是很多。
一些较小类别的shuffle可以通过更简单(更快)的网络来处理,您也可以在该页面上找到它。
最后在实践中,在现代x86硬件上,有一个高度通用的pshufb
函数,它可以在一个周期内(通常)将16个字节应用置换(但可能包括dupes和0)。在字节上分配位是slightly awkward,但是一旦你在那里,它只需要pshufb
置换,而pmovmskb
将它压缩回16位。