优化按位运算

时间:2012-09-17 08:35:43

标签: c bit-manipulation

我有一个无符号整数N = abcd,其中abcd表示从msb到{{1}的位}。我想得到以下数字

lsb

在C中使用按位运算的最快方法是什么?

我现在正在尝试的内容如下

x1 = ab0cd
x2 = ab1cd

此处偏移是我要插入unsigned int blockid1 = N>>offset; unsigned int key1 = (blockid<<(1+offset))|(((1<<offset)-1)&N); unsigned int key2 = (key1)|(1<<offset); 0的位置。

3 个答案:

答案 0 :(得分:1)

const unsigned int mask = (~0) << offset;  // same as -(2**offset)
unsigned int key1 = N + (N & mask);
unsigned int key2 = key1 - mask;

答案 1 :(得分:0)

由于您的输入只有4位宽,这意味着总共只有16位输出,我建议至少测试(即实现和分析)查找表。

现在,凭借超快的ALU和慢速(ish)内存,查找通常不会更快,但总是值得测试。一个小表意味着它不会非常污染缓存,这可能使它比一系列算术指令更快。

由于您的输出也非常小,因此完整的表格可以表示为:

const static uint8_t keys[16][2];

32个字节非常小,如果经常这样做(即在紧密循环中连续多次),该表应该完全适合缓存。

答案 2 :(得分:0)

你应该看看Jasper Neumann关于位置换的页面。它包括一个在线代码生成器。但是,对于您的特定情况,它可能会非常复杂(如果我们将0或1视为MSB,则排列一位)。

注意:我允许你谷歌这个地址,因为它没有域名,SO不允许直接IP。