【发布时间】:2014-02-13 10:01:01
【问题描述】:
在Bit Twiddling Hacks website 上,提供了以下算法来将整数四舍五入到二的下一次幂:
unsigned int v; // compute the next highest power of 2 of 32-bit v
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
我想编写一个元编程函数来计算相同的操作:
- 递归(用于编译时执行)
- 适用于任何类型的整数(它甚至应该适用于任何大小的可能尴尬的非标准整数,如 15 位、65 位...)
这是预期函数的形式:
template <typename Type,
// Something here (like a recursion index)
class = typename std::enable_if<std::is_integral<Type>::value>::type,
class = typename std::enable_if<std::is_unsigned<Type>::value>::type>
constexpr Type function(const Type value)
{
// Something here
}
怎么做?
例如:对于value = 42,它应该返回64
【问题讨论】:
-
是次高还是次高?它们是有区别的。一个是继任者,另一个是前任。只是好奇。
-
他追求更高的东西,如代码所示
-
你知道大多数编译器/机器组合都有一个 intlog 函数,它通常映射到一个操作码。
-
Danka 为样品。
-
接下来,你关心编译时运行时效率吗? (我可以使用更糟糕的算法还是需要像上面那样聪明)
标签: c++ c++11 recursion bit-manipulation template-meta-programming