在没有移位或LUT的索引之前设置位

时间:2016-04-14 22:27:58

标签: algorithm bit-manipulation bitwise-operators bit-shift

假设我需要在特定位索引之前设置所有位。以下是4位的示例:

index(0) = (0x0, 0000)
index(1) = (0x1, 1000)
index(2) = (0x3, 1100)
index(3) = (0x7, 1110)

如何在不使用移位或LUT的情况下执行此操作,而是使用最小的按位运算或算术或类似的效率?

1 个答案:

答案 0 :(得分:0)

这些约束非常奇怪,因为你需要有效的解决方案并削减只允许正确执行的两种方法。

所以你基本上想要计算x=(2^bit)-1,这很容易让位移:

x=(1<<bit)-1; // O(1)

LUT 也是......所以如何在没有这两个的情况下攻击它:

x=pow(2,bit)-1; //O(?) can be O(1),O(log(n)),O(n)

这远远没有效率,pow也使用位移和一些实现 LUT 。剩下的唯一解决方案是:

  1. <强>近似

    可以使用多项式,PCA或任何其他方法......但您需要考虑目标范围......这也不是非常优化和稳健。这可以是O(1),O(log(n)),O(n)但通常具有非常慢的恒定时间。

  2. 模仿bit-shif

    你可以用循环和添加来做到这一点:

    int x; for (x=1;bit;bit--) x+=x; x--;
    

    但这可以在O(n)中运行。无论如何,这比pow更快,除非你在 HW 上实现了一些pow2

  3. <强> [注释]

    在复杂性公式n=bit中,所有代码都在 C ++ 中,但第一个公式^表示权力。