名前空間
変種
操作

std::byteswap

From cppreference.com
< cpp‎ | numeric
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
 
 
ヘッダ <bit> で定義
template< class T >
constexpr T byteswap( T n ) noexcept;
(C++23から)

与えられた整数値 n のバイトを反転させます。

std::byteswap は、Tintegral を満たす場合、すなわち T が整数型である場合にのみオーバーロード解決に参加します。T にパディングビットがある場合、プログラムは ill-formed です。

目次

[編集] パラメータ

n - 整数値

[編集] 戻り値

n のオブジェクト表現のバイトが逆順になった、型 T の整数値。

[編集] 備考

この関数は、異なるエンディアンのデータを処理するのに役立ちます。

機能テストマクロ 規格 機能
__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 may not have padding bits");
    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 << "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

[編集] 関連項目

(C++20)
スカラ型のエンディアンを示す
(列挙型) [編集]
(C++20)
ビット単位の左ローテートの結果を計算する
(関数テンプレート) [編集]
(C++20)
ビット単位の右ローテートの結果を計算する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)