【问题标题】:optimizing bitwise operations优化按位运算
【发布时间】:2012-10-06 04:48:48
【问题描述】:

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

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

这里的偏移量是我要插入01的位置。

【问题讨论】:

  • 我猜按位运算都是常数时间运算,所以我不知道什么会传递为 fasted 位运算。如果你有什么工作,我不知道会有更快的方法来做这些事情。无论如何,这些操作在大多数情况下都会映射到 CPU 指令/
  • 偏移量是否总是2?,位置总是在第3位??
  • 不!偏移量可以是 0-30 之间的任何值

标签: c bit-manipulation


【解决方案1】:
const unsigned int mask = (~0) << offset;  // same as -(2**offset)
unsigned int key1 = N + (N & mask);
unsigned int key2 = key1 - mask;

【讨论】:

    【解决方案2】:

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

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

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

    const static uint8_t keys[16][2];
    

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

    【讨论】:

    • 4 位只是一个例子。数字是常规的 32 位宽
    【解决方案3】:

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

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

    【讨论】:

    • 我的关于位排列和其他内容的网站可以并且始终可以通过programming.sirrida.de 访问,但被重定向到具有半静态 IP 地址的私人服务器。自 2012-10-01 以来,它托管在“真实”网络空间上。贾斯珀·诺伊曼
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多