Namespaces
Variants

std::byteswap

cppreference.net에서
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐기됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
교환 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
비트 조작
(C++20)
(C++23)
의 정수 거듭제곱 2
(C++20)
(C++20)
(C++20)
이동
(C++29)
(C++29)
회전
(C++20)
(C++20)
계수
(C++20)
(C++20)
(C++20)
순열
(C++29)
(C++29)
엔디언
(C++20)
 
헤더에 정의됨 <bit>
template< class T >
constexpr T byteswap( T n ) noexcept;
(since 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 << "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)
비트 오른쪽 회전의 결과를 계산합니다
(함수 템플릿)
정수의 비트를 반전합니다
(함수 템플릿)