std::byteswap

来自cppreference.com
< cpp‎ | numeric
 
 
 
 
在标头 <bit> 定义
template<class T >
constexpr T byteswap( T n )noexcept;
(C++23 起)

逆转给定整数 n 中的字节。

std::byteswap 仅若 T 满足 integral(即 T 为整数类型)才参与重载决议。若 T 拥有填充位则程序非良构。

目录

[编辑]参数

n - 整数

[编辑]返回值

T 类型的整数,其对象表示由 n 的对象表示的字节按逆序组成。

[编辑]注解

此函数对处理有不同端序的数据有用。

功能特性测试标准功能特性
__cpp_lib_byteswap202110L(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);returnstd::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";constexprauto x =std::uint16_t(0xCAFE); dump(x); dump(std::byteswap(x));   std::cout<<"\nU32 的 byteswap:\n";constexprauto y =std::uint32_t(0xDEADBEEFu); dump(y); dump(std::byteswap(y));   std::cout<<"\nU64 的 byteswap:\n";constexprauto 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)
计算逐位右旋转的结果
(函数模板)[编辑]
close