这就是我需要做的:
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)
但我无法让它工作。感谢您抽出时间。
最佳答案
无需任何控制结构,甚至不需要?:
运算符,您就可以模拟自己的算法
int r = 0;
x >>= 1;
r += (x != 0);
x >>= 1;
r += (x != 0);
...
前提是,在 C 语言中,
- x 假定为正数(否则具有
int x=-1;
例如x >>= 1
n times 始终为!= 0
- 像
x != 0
这样的条件返回 0 (false) 或 1 (*true)
关于c - 通过 C 中的直线位操作查找正整数的最高有效位或以 2 为底的对数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14638536/