1

我有一个无符号整数,N = abcd其中a, b,表示从到 的位。我想得到以下数字cdmsblsb

x1 = ab0cd
x2 = ab1cd

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

我现在正在尝试如下

unsigned int blockid1 = N>>offset;
unsigned int key1 = (blockid<<(1+offset))|(((1<<offset)-1)&N);
unsigned int key2 = (key1)|(1<<offset);

这里的 offset 是我要插入的位置01.

4

3 回答 3

1
const unsigned int mask = (~0) << offset;  // same as -(2**offset)
unsigned int key1 = N + (N & mask);
unsigned int key2 = key1 - mask;
于 2012-09-22T16:33:33.933 回答
0

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

注意:我让你用谷歌搜索地址,因为它没有域名,并且 SO 不允许直接 IP。

于 2012-09-17T08:56:59.940 回答
0

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

这些天来,由于 ALU 超快和内存慢(ish),查找通常不会更快,但它总是值得测试。一个小表意味着它不会过多地污染缓存,这可能使其比一系列算术指令更快。

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

const static uint8_t keys[16][2];

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

于 2012-09-17T08:39:00.833 回答