根据置换表是否存在用于置换位的模式或标准方法,该表用于指定结果的每个位位置 - 从源获取哪个位置。
即。表格0322
会从0011
0010
我当前的策略是读取表的每个条目 - 创建一个位掩码,然后执行掩码和源的二进制AND,或者使用累积结果。
所以要处理第一个表项:
result |= ( ( (int) pow(2,table[0]) & source)
这看似昂贵,重复和自制。我错过了一些明显标准的简单方法吗?
答案 0 :(得分:5)
使用pow
函数真的很贵。重复和自酿的部分是不可避免的。更好的方法
result = 0;
for ( i = 0; i < table_size; i++ )
{
result <<= 1;
if ( source & (1 << table[i]) )
result |= 1;
}
答案 1 :(得分:3)
这种编码的一种可能用途是实现加密算法。我已经在DES和S-box中使用过它了,虽然它已经有一段时间了。关键是性能很重要。你需要快速的东西。
我的建议是预先计算蒙版并展开循环。对于您的4位示例:
int bits[4] = { 1, 2, 4, 8 };
result = (bits[table[0]] & source)
| (bits[table[1]] & source)
| (bits[table[2]] & source)
| (bits[table[3]] & source);
[我不认为这是正确的算法,但它符合问题。]
但我会检查生成的代码。一个足够好的优化编译器可以将你的代码转换成这个!