std::byteswap
来自cppreference.com
<tbody>
</tbody>
| 在标头 <bit> 定义
|
||
template< class T > constexpr T byteswap( T n ) noexcept; |
(C++23 起) | |
逆转给定整数 n 中的字节。
std::byteswap 仅若 T 满足 integral(即 T 为整数类型)才参与重载决议。若 T 拥有填充位则程序非良构。
参数
| n | - | 整数 |
返回值
T 类型的整数,其对象表示由 n 的对象表示的字节按逆序组成。
注解
此函数对处理有不同端序的数据有用。
| 功能特性测试宏 | 值 | 标准 | 功能特性 |
|---|---|---|---|
__cpp_lib_byteswap |
202110L |
(C++23) | std::byteswap
|
可能的实现
template<std::integral T>
constexpr T byteswap(T value) noexcept
{
static_assert(std::has_unique_object_representations_v<T>,
"T 不能有填充位");
auto value_representation = std::bit_cast<std::array<std::byte, sizeof(T)>>(value);
std::ranges::reverse(value_representation);
return std::bit_cast<T>(value_representation);
}
|
示例
运行此代码
#include <bit>
#include <concepts>
#include <cstdint>
#include <iomanip>
#include <iostream>
template <std::integral T>
void dump(T v, char term = '\n')
{
std::cout << std::hex << std::uppercase << std::setfill('0')
<< std::setw(sizeof(T) * 2) << v << " : ";
for (std::size_t i{}; i != sizeof(T); ++i, v >>= 8)
std::cout << std::setw(2) << static_cast<unsigned>(T(0xFF) & v) << ' ';
std::cout << std::dec << term;
}
int main()
{
static_assert(std::byteswap('a') == 'a');
std::cout << "U16 的 byteswap:\n";
constexpr auto x = std::uint16_t(0xCAFE);
dump(x);
dump(std::byteswap(x));
std::cout << "\nU32 的 byteswap:\n";
constexpr auto y = std::uint32_t(0xDEADBEEFu);
dump(y);
dump(std::byteswap(y));
std::cout << "\nU64 的 byteswap:\n";
constexpr auto z = std::uint64_t{0x0123456789ABCDEFull};
dump(z);
dump(std::byteswap(z));
}
可能的输出:
U16 的 byteswap:
CAFE : FE CA
FECA : CA FE
U32 的 byteswap:
DEADBEEF : EF BE AD DE
EFBEADDE : DE AD BE EF
U64 的 byteswap:
0123456789ABCDEF : EF CD AB 89 67 45 23 01
EFCDAB8967452301 : 01 23 45 67 89 AB CD EF
参阅
(C++20) |
指示标量类型的端序 (枚举) |
(C++20) |
计算逐位左旋转的结果 (函数模板) |
(C++20) |
计算逐位右旋转的结果 (函数模板) |