假设我需要在特定位索引之前设置所有位。以下是4位的示例:
index(0) = (0x0, 0000)
index(1) = (0x1, 1000)
index(2) = (0x3, 1100)
index(3) = (0x7, 1110)
如何在不使用移位或LUT的情况下执行此操作,而是使用最小的按位运算或算术或类似的效率?
答案 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 。剩下的唯一解决方案是:
<强>近似强>
可以使用多项式,PCA或任何其他方法......但您需要考虑目标范围......这也不是非常优化和稳健。这可以是O(1),O(log(n)),O(n)
但通常具有非常慢的恒定时间。
模仿bit-shif
你可以用循环和添加来做到这一点:
int x; for (x=1;bit;bit--) x+=x; x--;
但这可以在O(n)
中运行。无论如何,这比pow
更快,除非你在 HW 上实现了一些pow2
。
<强> [注释] 强>
在复杂性公式n=bit
中,所有代码都在 C ++ 中,但第一个公式^
表示权力。