# std::byteswap

< cpp‎ | numeric

定义于头文件 `<bit>` |  |
template< class T > constexpr T byteswap( T n ) noexcept; |  | (C++23 起)

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

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

### 参数

n | - | 整数值

### 返回值

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

### 注解

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

### 示例

    #include <bit>
    #include <cstdint>
    #include <concepts>
    #include <iostream>
    #include <iomanip>

    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 << "byteswap for U16:\n";
        constexpr auto x = std::uint16_t(0xCAFE);
        dump(x);
        dump(std::byteswap(x));

        std::cout << "\nbyteswap for U32:\n";
        constexpr auto y = std::uint32_t(0xDEADBEEFu);
        dump(y);
        dump(std::byteswap(y));

        std::cout << "\nbyteswap for U64:\n";
        constexpr auto z = std::uint64_t{0x0123456789ABCDEFull};
        dump(z);
        dump(std::byteswap(z));
    }

可能的输出：

    byteswap for U16:
    CAFE : FE CA
    FECA : CA FE

    byteswap for U32:
    DEADBEEF : EF BE AD DE
    EFBEADDE : DE AD BE EF

    byteswap for U64:
    0123456789ABCDEF : EF CD AB 89 67 45 23 01
    EFCDAB8967452301 : 01 23 45 67 89 AB CD EF

### 参阅

endian (C++20) | 指示标量类型的端序 (枚举)
rotl (C++20) | 计算逐位左旋转的结果 (函数模板)
rotr (C++20) | 计算逐位右旋转的结果 (函数模板)