如何编写constexpr交换函数以更改整数的字节序?

user1095108:

如何编写一个constexpr函数以交换整数的字节序,而又不依赖于编译器扩展,您能否举一个例子说明如何做到这一点?

ecatmur:

是的,这很容易;这是一个递归(与C ++ 11兼容)的实现(仅无符号整数类型):

#include <climits>
#include <cstdint>
#include <type_traits>

template<class T>
constexpr typename std::enable_if<std::is_unsigned<T>::value, T>::type
bswap(T i, T j = 0u, std::size_t n = 0u) {
  return n == sizeof(T) ? j :
    bswap<T>(i >> CHAR_BIT, (j << CHAR_BIT) | (i & (T)(unsigned char)(-1)), n + 1);
}

例。

在这里,我j用作累加器和n循环计数器(索引字节)。

如果您有支持C ++ 17 fold表达式的编译器,则可以编写一些内容,将其扩展为您手工编写的内容:

template<class T, std::size_t... N>
constexpr T bswap_impl(T i, std::index_sequence<N...>) {
  return ((((i >> (N * CHAR_BIT)) & (T)(unsigned char)(-1)) <<
           ((sizeof(T) - 1 - N) * CHAR_BIT)) | ...);
}; //                                        ^~~~~ fold expression
template<class T, class U = typename std::make_unsigned<T>::type>
constexpr U bswap(T i) {
  return bswap_impl<U>(i, std::make_index_sequence<sizeof(T)>{});
}

这种形式的优势在于,由于它不使用循环或递归,因此可以保证您获得最佳的汇编输出-在x86-64上,clang甚至设法使用该bswap指令

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章