gpt4 book ai didi

c - 快速计算 64 位整数的 log2

转载 作者:太空狗 更新时间:2023-10-29 16:20:00 25 4
gpt4 key购买 nike

一个很棒的编程资源 Bit Twiddling Hacks 提出 ( here ) 以下方法来计算 32 位整数的 log2:

#define LT(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n
static const char LogTable256[256] =
{
-1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
LT(4), LT(5), LT(5), LT(6), LT(6), LT(6), LT(6),
LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7)
};

unsigned int v; // 32-bit word to find the log of
unsigned r; // r will be lg(v)
register unsigned int t, tt; // temporaries
if (tt = v >> 16)
{
r = (t = tt >> 8) ? 24 + LogTable256[t] : 16 + LogTable256[tt];
}
else
{
r = (t = v >> 8) ? 8 + LogTable256[t] : LogTable256[v];
}

并提到

The lookup table method takes only about 7 operations to find the log of a 32-bit value. If extended for 64-bit quantities, it would take roughly 9 operations.

但是,遗憾的是,它没有提供任何关于实际应该采用哪种方式将算法扩展到 64 位整数的信息。

有任何关于这种 64 位算法的提示吗?

最佳答案

内部函数确实很快,但对于真正跨平台、独立于编译器的 log2 实现来说仍然不够。因此,如果有人感兴趣,这里是我在自己研究该主题时遇到的最快、无分支、类似于 CPU 的抽象类 DeBruijn 算法。

const int tab64[64] = {
63, 0, 58, 1, 59, 47, 53, 2,
60, 39, 48, 27, 54, 33, 42, 3,
61, 51, 37, 40, 49, 18, 28, 20,
55, 30, 34, 11, 43, 14, 22, 4,
62, 57, 46, 52, 38, 26, 32, 41,
50, 36, 17, 19, 29, 10, 13, 21,
56, 45, 25, 31, 35, 16, 9, 12,
44, 24, 15, 8, 23, 7, 6, 5};

int log2_64 (uint64_t value)
{
value |= value >> 1;
value |= value >> 2;
value |= value >> 4;
value |= value >> 8;
value |= value >> 16;
value |= value >> 32;
return tab64[((uint64_t)((value - (value >> 1))*0x07EDD5E59A4E28C2)) >> 58];
}

向下舍入到 2 的下一个较低次幂的部分取自 Power-of-2 Boundaries并且获取尾随零数的部分取自 BitScan ((bb & -bb) 代码用于挑出设置为 1 的最右边的位,在我们将值向下舍入为 2 的下一次幂后不需要这样做)。

顺便说一句,32 位实现是

const int tab32[32] = {
0, 9, 1, 10, 13, 21, 2, 29,
11, 14, 16, 18, 22, 25, 3, 30,
8, 12, 20, 28, 15, 17, 24, 7,
19, 27, 23, 6, 26, 5, 4, 31};

int log2_32 (uint32_t value)
{
value |= value >> 1;
value |= value >> 2;
value |= value >> 4;
value |= value >> 8;
value |= value >> 16;
return tab32[(uint32_t)(value*0x07C4ACDD) >> 27];
}

与任何其他计算方法一样,log2 要求输入值大于零。

关于c - 快速计算 64 位整数的 log2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11376288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com