【发布时间】:2016-09-02 20:09:13
【问题描述】:
bit twiddling hacks 网站提出了以下非常有效的位反转功能:
// Bitswap: reverse the bits of the value of unsigned integral type T
template <class T>
constexpr T bitswap(T src)
{
constexpr std::size_t char_bit = std::numeric_limits<unsigned char>::digits;
constexpr std::size_t digits = sizeof(T) * char_bit;
std::size_t size = digits;
T mask = ~T();
while ((size >>= 1) > 0) {
mask ^= (mask << size);
src = ((src >> size) & mask) | ((src << size) & ~mask);
}
return src;
}
- 有没有办法通过使用模板元编程递归来展开循环来加速这个函数?
- 有没有办法让它与
__uint128_t等扩展类型一起工作? (原版适用于__uint128_t) - 如果
digits被正确初始化为正确的位数,该函数理论上是否可以反转具有非两位数的幂的类型的位? (例如假设性的uint41_t)。
【问题讨论】:
-
您是否检查过 1. 非模板的展开,2. 采用第二个参数digitsleft 的递归展开(可能带有助手)?
-
现在大多数编译器都知道在使用优化时可以根据需要展开循环,所以我不会担心它,除非它运行得比没有优化时慢。
标签: c++ recursion c++14 bit template-meta-programming