【问题标题】:Extending bit twiddling hack for Log_2 to 64 bit将 Log_2 的 bit twiddling hack 扩展到 64 位
【发布时间】:2011-07-18 03:16:10
【问题描述】:

我已经在 C# 中实现了代码 here 来获取 int 的 MSB。我不确定我需要对日志引用表和将代码扩展到 64 位的主要代码做什么。

文字中唯一说的是它需要多 2 个 CPU 操作,所以我推断变化很小。

【问题讨论】:

  • 它被标记为 C,但你使用的是 C#?
  • 源代码是C,我会转成C#。我不是要别人为我做这件事……只是如何在 64 位(C 中)实现 C。
  • 假设您使用的是一种 x86 架构,我将只使用 bsr 指令。在 gcc 中,它可以作为 __builtin_clzll() 使用。这用一条指令计算对数...不幸的是,我不知道如何将其转换为 C#。
  • 为什么投反对票?这是一个完全合法的问题。
  • bsr 将是完美的。我想知道为什么 MS 没有在 C# 中实现这些较低级别的命令。这是我第三次遇到需要一个。

标签: c 64-bit bit-manipulation 32bit-64bit


【解决方案1】:

该表不需要更改。还需要一层if()

if (ttt = v >> 32)
{
    if (tt = ttt >> 16)
         r = (t = tt >> 8) ? 56 + LogTable256[t] : 48 + LogTable256[tt]
    else
         r = (t = ttt >> 8) ? 40 + LogTable256[t] : 32 + LogTable256[ttt]
}
else
{
    if (tt = v >> 16)
        r = (t = tt >> 8) ? 24 + LogTable256[t] : 16 + LogTable256[tt];
    else 
        r = (t = v >> 8) ? 8 + LogTable256[t] : LogTable256[v];
}

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多