c - 通过 C 中的直线位操作查找正整数的最高有效位或以 2 为底的对数

标签 c bit-manipulation

这就是我需要做的:

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/

相关文章:

bit-manipulation - 如何从 Common Lisp 访问新的 x86 位操作指令?

sql - Oracle Pro*C 用游标更新表失败

C, strcat 之后的 char[] 格式错误的 int

c - 如何避免 linux 设备驱动程序中的 copy_from_user 和 copy_to_user

c - gcc,未初始化的全局变量

mysql - 我可以在 1 列中保存 7 个 boolean 值吗?

c - 我如何定义两个结构,每个都在第二个结构中使用? C语言

用于生成下一位以翻转格雷码的 C 代码

c++ - 是否有一个用于位操作的(C/C++)库?

swift 3 : How to extend [UInt8] to add getUInt32BE function