我有一些来自与我不同的库的正常数值,称之为 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/