0

这是我需要做的:

int lg(int v)
{
    int r = 0;
    while (v >>= 1) // unroll for more speed...
    {
        r++;
    }
}

我在以下位置找到了上述解决方案:http: //graphics.stanford.edu/~seander/bithacks.html#IntegerLog

这行得通,但我需要在没有大于 0xFF (255) 的循环、控制结构或常量的情况下执行此操作,事实证明这对我来说很难找到。我一直在尝试使用表格中的条件来解决问题

( x ? y : z ) = (((~(!!x) + 1)) & y) | ((~(~(!!x) + 1)) & z)

但我无法让它工作。谢谢你的时间。

4

2 回答 2

0

这听起来像是一项家庭作业。好吧,如果你不能使用控制结构,一个好的选择是预先计算你能做的事情:分而治之。求解较小的部分(一个字节,一个半字节,您的选择),并应用于整数的部分。

于 2013-02-01T02:05:16.693 回答
0

无需任何控制结构,甚至无需?:操作员,您都可以模拟自己的算法

int r = 0;

x >>= 1;
r += (x != 0);
x >>= 1;
r += (x != 0);
...

前提是,在 C 中,

  • x被假定为正数(否则int x=-1;例如 x >>= 1 n 次总是!= 0
  • x != 0返回 0 ( false ) 或 1 (*true)这样的条件
于 2013-02-01T02:36:15.670 回答