C中的位置换表

时间:2014-04-15 03:06:55

标签: c bit-manipulation

根据置换表是否存在用于置换位的模式或标准方法,该表用于指定结果的每个位位置 - 从源获取哪个位置。

即。表格0322会从0011

创建结果0010

我当前的策略是读取表的每个条目 - 创建一个位掩码,然后执行掩码和源的二进制AND,或者使用累积结果。

所以要处理第一个表项:

result |= ( ( (int) pow(2,table[0]) & source)

这看似昂贵,重复和自制。我错过了一些明显标准的简单方法吗?

2 个答案:

答案 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);

[我不认为这是正确的算法,但它符合问题。]

但我会检查生成的代码。一个足够好的优化编译器可以将你的代码转换成这个!