gpt4 book ai didi

c++11 - 在编译时计算以 2 为底的整数对数的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 23:41:46 35 4
gpt4 key购买 nike

我有一些来自与我不同的库的正常数值,称之为 the_val .现在,我要 log_of_the_val成为 floor(log_2(the_val)) - 不是用 C++ 代码说话 - 我当然希望在编译时发生这种情况。

现在,使用 gcc,我可以做类似的事情

decltype(the_val) log_of_the_val = sizeof(the_val) * CHAR_BIT - __builtin_clz(the_val) - 1;

我认为这应该有效(长度 - 标题零的数量)。否则,我可以自己为它实现一个 constexpr 函数,但我敢打赌,我可以在编译时使用其他更简单、更便携的函数。 ......问题是,那会是什么?

最佳答案

最直接的解决方案是使用 std::log2来自 <cmath> ,但没有指定为 constexpr - 它在 gcc 下,但不在 clang 下。 (实际上,libstdc++ std::log2 调用了 __builtin_log2 ,这是gcc下的constexpr。)
__builtin_clz在 gcc 和 clang 下都是 constexpr,所以你可能想使用它。

完全可移植的解决方案是编写一个递归的 constexpr 积分 log2:

constexpr unsigned cilog2(unsigned val) { return val ? 1 + cilog2(val >> 1) : -1; }

关于c++11 - 在编译时计算以 2 为底的整数对数的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35311711/

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